조건부 컴파일 매크로
조건부 컴파일 매크로는 특정 조건에 따라 소스코드의 일부를 삽입하거나 삭제할 수 있도록 디자인된 지시자입니다
총 다섯 가지가 있습니다.
-
#if... #endif : 참이라면
-
#ifdef... #endif : 정의되었다면
-
#ifndef... #endif : 정의되지 않았다면
-
#else의 삽입 (#if,#ifdef,#ifndef에 해당) : #if(또는#ifdef,#ifndef)에서 아니라면
-
#elif의 삽입 (#if에만 해당) : else if와 같은것.(앞 조건문이 참이 아니라면)
4,5번은 1,2,3번의 중간에 들어간다는 공통점이 있고 1,2,3번은 끝이 #endif라는 점입니다.
#if... #endif
#include <stdio.h>
#define one 1
#define zero 0
int main(void) {
#if one //one이 참이라면
printf("%d", one);
#endif
#if zero //zero가 참이라면
printf("%d", zero);
#endif
return 0;
}
#if 다음에 조건이 옵니다. 선행 처리기로 인해 치환되면 1입니다. if문에서 1은 참을 의미합니다.
반대로 아래 #if zero는 치환되면 #if 0으로 바뀌기 때문에 거짓이 됩니다.
#include <stdio.h>
int main(void) {
printf("%d",1);
return 0;
}
선행 처리기 이후의 코드입니다. 앞에 #define에서 설명했듯이 치환되면서 명령문이었던 매크로는 사라집니다.
위에 #if one은 참이기 때문에 1을 출력하는 printf함수만 남습니다.
#elif
#include <stdio.h>
#define one 1
int main(void) {
#if one //one이 참이라면
printf("%d", one);
#elif two
printf("%d", two);
#endif
return 0;
}
이 코드에선 two가 참 이어도 one이 참이어서 첫 번째 printf문만 남습니다.
ifdef... #endif
#include <stdio.h>
#define SQUARE(X) ( (X)*(X) )
#define ADD(A) ( (A) + (A) )
int main(void) {
#ifdef SQUARE
printf("%d", SQUARE(2));
#endif
#ifdef ADD
printf("%d", ADD(10));
#endif
return 0;
}
#ifdef...#endif 즉 정의되어있다면 이라는 조건부 컴파일 매크로를 사용했습니다.
일단 SQUARE(X)와 ADD(X)라는 매크로 함수가 정의가 되어있습니다.
선행 처리기를 통해 #ifdef에서 SQUARE,ADD둘다 정의되어있으니 둘다 참입니다.
#include <stdio.h>
int main(void) {
printf("%d", ((2)*(2)));
printf("%d", ((10)+(10)));
return 0;
}
선행처리기 이후의 코드입니다. ifdef 모두 참이기 때문에 #define도 치환되고 printf문도 컴파일되었습니다
댓글