Embedded World

[C] C언어의 조건부 컴파일 지시자(#if #ifdef #ifndef #endif) 본문

소프트웨어/C

[C] C언어의 조건부 컴파일 지시자(#if #ifdef #ifndef #endif)

jh-rrr 2025. 7. 17. 20:18

C는 값 또는 식을 기준으로 조건부 컴파일을 수행할 수 있다.

 

#define <매크로> <값>

#define은 <값>을 <매크로>로 치환해준다.

#include <stdio.h>
#define PI 3.141592

int mian(void){
	print("%d\n", PI);
    
    return 0;
}

#if <조건식>

<조건식>이 참이면, #if와 #endif 사이의 코드를 컴파일한다. 이는 보통 중복 컴파일을 방지하기 위해 사용된다.

#if 값 or 식
코드
#endif

 

#if, #endif 는 전처리기 과정을 거치면 조건이 참인 코드만 남는다.

#include <stdio.h>
#define PI 3.14

int main(void){
#if PI == 3.14
	printf("PI는 3.14");
#elif PI > 3.14
	printf("PI값이 좀 이상한데?");
#endif
	prinf("PI값이 3.14보다 작다.");
    
    return 0;
}

(전처리기 거치기 전) 

#include <stdio.h>
#define PI 3.14

int main(void){

	printf("PI는 3.14");





    return 0;
}

(전처리기 이후)

 

#if defined <매크로> / ifdef <매크로>

#ifdef 와 #if defined 그리고 #ifndef 와 #if !defined 의 용도는 같다. 그러나 #ifdef와 #ifndef는 매크로명의 정의 여부만 확인 가능하니 다른 연산자와 함께 조건식을 만들 땐 defined 나 !defined를 사용해야한다.

#if defined <매크로>
코드
#endif

 

예를 들면 이런 코드가 가능하다.

#include <stdio.h>

#define DEBUG
#define TEST

int main(){
#if (defined DEBUG || degined TEST) && !defined (VERSION_1)
	printf("Debug\n");
#endif
	return 0;
}

>> 전처리 전

#include <stdio.h>

#define DEBUG
#define TEST

int main(){

	printf("Debug\n");

	return 0;
}

>> 조건이 참이므로 코드는 남게된다.

 

#if는 다음처럼 DEBUG 매크로를 정의해 사용한다.

#define DEBUG 1처럼 코드에서 1,0을 설정해 디버그 코드 사용 여부를 제어하거나

컴파일 시 DEBUG 매크로를 매개변수로 주며 디버그 코드를 제어할 수 도 있다.

(GCC 컴파일러의 경우, -D매크로이름, -D매크로이름=값)

$ gcc main.c -DDEBUG
$ gcc main.c -DDEBUG_LEVEL=2

 

#define DEBUG 1 	// 코드에서 디버그 코드 제어

#if DEBUG
	printf("Debug message\n");
#endif

#ifdef DEBUG		// 코드에서 DEBUG 매크로를 정의했거나, 컴파일 옵션에서 DEBUG 매크로 설정
	printf("Debug"\n);
#endif

#ifdef DEBUG_LEVEL >= 2
	printf("Debug Level more than two\n");
#endif

>>> Debug message, Debug, Debug Level more than two 라고 출력될거다.

 

#elif 와 #else

#ifdef 매크로
코드1
#elif defined 매크로
코드2
#else
코드3
#endif

#if 조건식
코드4
#elif 조건식
코드5
#else
코드6
#endif

 

예시 코드!

#include <stdio.h>

#define USB

int main()
{
#ifdef PS5				// PS5가 정의되어있을 때 코드를 컴파일
	printf("PS5\n");
#elif defined USB
	printf("USB\n");
#else
	printf("지원하지 않는 장치입니다.\n");
#endif

	return 0;
}

>>> "USB"

 

#ifndef <매크로>

#ifndef는 매크로가 정의되어있지 않을 때 코드를 컴파일한다.

#ifndef 매크로
#define __EXAMPLE_H

코드

#endif	/* __EXAMPLE_H */

 

#include <stdio.h>

#define NODEBUG

int main()
{
#ifndef DEBUG
	// do something
#endif
	
    return 0;
}

>>> do something이 실행된다.

 

 

 

reference: https://dojang.io/mod/page/view.php?id=664 / 책 "혼자서 공부하는 C언어" p567

'소프트웨어 > C' 카테고리의 다른 글

[C] 헤더파일에 대하여  (0) 2025.08.02
[C] C언어의 extern 키워드  (0) 2025.07.30
[C] C의 파일시스템, fopen_s()  (0) 2025.07.24
[C] volatile 키워드  (0) 2025.06.23
[C/C++] #include "ex.h" 과 <ex.h>의 차이  (0) 2025.03.26