자료실/C언어

C언어 - #if, #elif, #else, #endif 와 ifdef, #ifndef, #endif 지시문

자료수집중 2020. 7. 22.
반응형

#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

댓글