#if, #elif, #else, #endif와 #ifdef, #endif를 보통 조건부 컴파일 지시자라고 합니다.
#이 앞에 오는 전처리 지시자입니다.
C언어뿐만 아니라 C++, C#에서도 자주 등장하므로 알아보고 가겠습니다.
먼저 #if, #elif, #else, #endif부터 알아보겠습니다.
일반적으로 사용하는 if , else if, else와 방식은 유사합니다.
대신 #elif, #else는 사용하지 않아도 상관없지만 #if를 사용하면 꼭 끝나는 부분에#endif를 삽입해야 합니다. 전처리기는 {}를 사용하지 않기 때문에 끝을 내줘야 합니다.
보통 조건부로 코드를 추가 및 제거해서 컴파일할 때 많이 사용합니다.
예제로 알아보겠습니다.
#include <Stdio.h>
#define VERSION 3
int main() {
#if (VERSION == 1)
printf("VERSION 1 입니다.\n");
#elif (VERSION == 2)
printf("VERSION 2 입니다.\n");
#else
printf("VERSION 3 입니다. \n");
#endif
return 0;
}
#define으로 VERSION 3 매크로를 선언했습니다.
#if, #elif, #else는 조건부에 참(True)이 되는 코드만 컴파일이 됩니다.
전처리 지시자이므로 일반 변수로는 조건을 사용할 수 없습니다. 매크로로 사용이 가능합니다.
다음으로 #ifdef, #ifndef #endif입니다.앞에서 #if는 조건을 봤다면 #ifdef는 조건의 매크로가 정의만 되어있으면 컴파일합니다.
#ifndef는 반대로 매크로가 정의가 안되어있으면 포함된 코드를 컴파일합니다.
#ifdef, #ifndef도 꼭 #endif로 끝내야 합니다.
예제로 살펴보겠습니다.
#include <Stdio.h>
#define TEST
int main() {
#ifdef TEST
printf("----테스트 버전입니다.---- \n\n");
#endif
#ifndef TEST
printf("----배포 버전입니다.---- \n\n");
#endif
printf("Hello World \n");
return 0;
}
#define TEST 매크로 선언하지 않으면
조건부 컴파일 지시자는 사용처가 굉장히 많습니다.
운영체제에 따라서 다르게 구분하여 코드를 컴파일하거나 버전에 따라서 컴파일할 코드를 정해줄 수 있습니다. 또는 국가별로 다른 언어 버전의 헤더 파일을 추가해줄 수도 있습니다.
예를 들어 코딩을 막 하다 보면 중간중간 값도 확인해야 하고 특정 부분에서 어떤식으로 연산이 되는지, 디버깅 등 여러 가지 확인해보고 출력해보는 코드가 생각보다 많이 들어갑니다.
이 코드들을 매번 배포용으로 할 때마다 지우던가 주석 처리하던가 해서 사용자는 보이지 않게 해야 하는 번거로움이 있습니다.
이때 조건부 컴파일 지시자로 확인용 코드들을 묶어놓으면 매크로 정의만 변경하면 일괄적으로 조건부로 컴파일이 되게 해주는 역할로도 사용할 수 있습니다.
'공부 자료실 > C언어' 카테고리의 다른 글
C언어 - 동적 메모리 할당 (0) | 2020.08.07 |
---|---|
C언어 - 파일 입출력 (0) | 2020.08.05 |
C언어 - 내장 매크로 (0) | 2020.07.21 |
C언어 - #define (0) | 2020.07.04 |
C언어 - void 포인터 (0) | 2020.07.03 |
댓글