C언어를 하는 사람들이라면 한번씩을 봤을 구문.
전처리 혹은 선행처리기 라고 불리우는 # 구문!

주로 사용하는 #include나 #define는 다 알고있을것이다.
위의 구문또한 어렵진 않지만 헷갈리고 또 사용함에따라 좀더 효율적인 코딩을 할수가있다.
설명에 앞서 사용법을 알아야한다. 이것은 기존에 있는 소스를 코드를 삭제및 수정하지 않고 활성화 비활성화 하는데 사용한다.

#define
말그대로 정의한다.

#define A 10
A를 10이라고 칭하는것이다.

#ifdef A
 code.....
#endif
만약 A가 정의되어있다면 소스코드를 실행함.

#ifndef A
 code.....
#endif
만약 가 선언되지 않았따면 소스코드를 실행함.
보통 선언되었는지 안되었는지 확인하기위해 쓰며, 선언되지 않았을경우 안에다가 #define로 선언해줄수있다. 이는 중복선언으로 인한 에러를 방지하기위해서이다.

#if #defined A || #defined B
두가지가 한번에 나오는데 #if는 말그대로 조건문이다. || 또는 && 등의 연산자를 같이 사용할수있다. #defined는 한번에 여러개를 검사하여 수행할수있다. 위의 것들처럼 하나만 검사하는게 아니라 예제에 있듯이 둘개를 비교하여 둘중 하나라도 정의되어있다면 #endif 전까지의 구문을 실행한다.
반대로 &&를 쓴다면 두개가 다 정의되어있어야만 실행된다.

#undef A
말그대로 정의되어있는 A를 무효화 시킨다. 한마디로 없애버린다. ㅡ_ㅡ;

간단한 설명은 여기까지이고 좀더 사용법을 알기쉽도록 소스를 보고 설명하겠다.

#ifndef lint
#include "Z_READ.h"
#endif
#ifdef A
#include "A_READ.h"
#endif
#ifdef B
#include <B_READ.h>
#else
#include <C_READ.h>
#endif


처음 lint가 정의 되어 있지 않다면  "Z_READ.h"를 포함시킨다.
그리고 첫구문 종료
만약 A가 정의되어있다면 A_READ.h를 포함시킨다.
만약 B가 정의되어있다면 B_READ.h를 포함시키고 아니라면 C_READ.h를 포함시킨다.
그리고 종료.
그렇게 어렵지 않을것이다.

다음예를 보자.


#ifndef lint
#include "Z_READ.h"
#endif
#ifdef A
#include "A_READ.h"
#endif
#ifdef B
#include <B_READ.h>
switch (B)
{
  case 1:
     B++;
     break;
   case 2:
     B--;
     break;
   case 3:
     B=B+B;
     break;
   case 0: 
     break;
 }
#else 
#include <C_READ.h>
 struct C{
    int CC;
    char CCC;
  };

#endif

보는 봐와같이 소스코드를 넣으므로써 다양한 코딩을 할수가 있다.
만약 B가 정의되어있다면 B.READ.h를 포함시키고 아래의 switch문을 실행한다.
아래의 구문역시 정의도어있다면 구조체 C를 만드는 작업이다.

static int A(int A)
{
   int C=A+5;
   #ifndef A_READ
     #include "A_READ.h"
     C=A;
   #endif
   return C;
}

다음 코드는 코딩중간에 선행처리기를 넣어서 쓴 코드이다.
혹시 코딩을 하다가 필요할경우 위처럼 중간에 넣어 사용할수있다.
만약 A_READ.h가 정의되어있지 않다면 A_READ.h를 포함하고 아래의 코드를 실행한다.

즉 정의 되어있다면 C의 값은 A+5가 되는것이고 정의 되어있다면 C의 값은 A가 되는것이다.

이정도면 이해하시고 사용하실 수 있을꺼라 생각합니다. 
그럼 다음에또 ㄷㄷ

  
  





 
Posted by Nvdark
,