본문 바로가기
프로그래밍 언어/C 언어

[C] [전처리기] #ifdef

by 까망 하르방 2021. 3. 20.
반응형

#ifdef

사용되는 형태는 아래와 같다. 

#ifdef {NAME}

    ...

#else

    ...

#endif

 

 

{NAME} 선언 여부에 따라 컴파일 되는 부분이 달라진다.

#define에서 선언여부와 관계 있지 정의 여부와는 관계가 없다.

#define TEST

#define TEST 3

 

 

Q) 이러한 전처리기 언제 사용할까?

인터넷에서 파일을 다운받는 프로그램을 만든다고 했을 때, 

다운받는 최대 속도(MAX_SPEED)를 배포 유형에 따라 설정할 수 있다.

    - 무료 버전 최대 속도 10 / 유료 버전 최대 속도 100

#ifdef __FREE__
#define MAX_SPEED 10
#else
#define MAX_SPEED 100
#endif
int speed;
int main() {
       // 최고 속도이하로 수치조정
       if (speed > MAX_SPEED)
              speed = MAX_SPEED;
}

컴파일러 옵션에서 __FREE__를 참으로 지정해서 컴파일 하면 무료버전으로 생성되는 것이다.

 

 

또 다른 예시로는 윈도우 버전과 리눅스 버전을 예로 들 수 있다.

C 코드를 기반으로 하기 때문에 일부 코드만 다르게 코딩하면 될 때,

굳이 동일한 내용을 2개의 파일로 관리하기 보다는 하나의 파일에서 전처리기를 통해서 제어하면 된다.

#ifdef WINDOWS
    // 윈도우일때 필요한 코드
#else
    // 리눅스일때 필요한 코드
#endif

이러한 처리는 웹 상에서 개발 / 디바이스에서 테스트 등 다양하게 활용할 수 있다.

ex) __DEBUG__ / __TEST__ / __KERNEL

 


Visual Studio는 아래 이미지와 같이 컴파일 옵션을 설정할 수 있다.

 

 

각 상태를 #ifdef _DEBUG 통해 컴파일 되는 영역을 구분할 수 있다. 

#include <stdio.h>

#ifdef _DEBUG
char MODE[30] = "Debug Mode";
#else
char MODE[30] = "Release Mode";
#endif

int main() {
    printf("%s\n", MODE);
}

release 모드 debug 모드

 

 

▶ "Release" 상태에서 실행 결과

release 모드

반응형

'프로그래밍 언어 > C 언어' 카테고리의 다른 글

[C] 포인터와 배열의 관계  (0) 2021.03.20
[C] 동적 할당 필요성  (0) 2021.03.20
[C] calloc( ) & realloc( )  (0) 2021.03.20
[C] 문자열  (0) 2021.03.20
[C] 배열과 문자열 관계  (0) 2021.03.20

댓글