C++

[C/C++] 전처리기 지시문 조건부 처리 (#if, #elif, #else #endif, #ifdef, #ifndef) 사용법 차이점 (헤더 중복 선언 방지, 크로스 플랫폼, 디버깅 테스트 모드)

강담비 2023. 6. 27. 15:20
반응형

 

 

전처리기 지시문 ? 

 

 

전처리기(preprocessor)는 컴파일 직전에 수행되는 별도의 프로그램으로, 실행되면 #으로 시작하는 지시자를 찾아 기능을 수행한다. 전처리기 지시문을 사용해 헤더파일 중복 방지, 버전 관리, 크로스 플랫폼 개발등을 효율적으로 할 수 있다.

 

 


 

전처리기 지시자에는 대표적으로 #include, #using 가 있다. 

/* 전처리기 지시문 예시 */
#include <iostream>
#define MAX 80

조건부 전처리기 지시문 ( #if ~ #elif ~ #else ~ #endif )

 

 

이번 포스팅에서는 조건부 처리가 가능한 전처리기 지시문을 다뤄보려 한다.

전처리기 조건부 전처리기 지시문은 일반적인 조건문과 같이 if, elif, else 형태로 이루어지고 중첩도 가능하다.

 

일반적인 조건문과 차이점은 크게 두가지가 있는데,

 

1. 조건이 성립하지 않을 경우 실행뿐 아니라 컴파일도 되지 않는다.

2. 괄호를 사용하지 않기 때문에 #if 문이 끝나면 #endif 를 사용해야 한다.

 

이러한 특징 때문에 #if는 조건에 따라 소스코드를 삽입하거나 삭제하기 위해 사용된다.

특히 해당 상황에 컴파일 에러를 불러일으킬 만한 코드에 사용한다.

#include <iostream>
#define NUM 5

int main() 
{
	if (NUM < 5)
    {
    	 cout << "컴파일 O, 실행 X" << endl;
    }else
    {
    	cout << "컴파일 O, 실행 O" << endl;
    }
    
#if NUM < 5
	cout << "컴파일 X, 실행 X" << endl;
#elif NUM==5
	cout << "컴파일 O, 실행 O" << endl;
#endif
}

#ifdef, # ifndef 지시어 ( #ifdef ~ #else ~ #endif )

 

 

#ifdef는 '정의되어 있다면', #ifndef는 '정의되어 있지 않다면' 이라는 의미를 지닌 조건 지시어다. 

#if 말고 #ifdef을 활용하는 예시를 보면 더 이해가 빠르다.

 

 

헤더파일 중복 선언 방지 예시

/* a.h 헤더 파일이 선언되지 않은 경우에만 선언 */
#ifndef A_H_
#define A_H_

/* 헤더 파일 내용 */

#endif

 

 

크로스 플랫폼 구현 예시

/* 해당 플랫폼에 맞는 코드 컴파일 */
#ifdef _WIN32
/* windows 코드 */
#else
/* linux 코드 */
#endif

 

 

디버그, 테스트 코드 적용 예시
/* 디버그 모드일 때만 코드 컴파일 */
#ifdef __DEBUG__
/* 디버그 코드 */
#endif