Language/C

C언어 강좌(조건부 컴파일/매크로 함수와 #undef)

Dexter_- 2016. 9. 19. 09:43
728x90
반응형

 

 

 

C언어


 

 

조건부 컴파일

  • 지시자는 #if, #else, #elif, #endif가 있다.

#if 조건 수식

    명령문1

#else

    명령문2

#endif

 

  • 조건수식이 참일 경우 명령문1 이 컴파일되고, 거짓일 경우에는 명령문2가 컴파일된다.
  • 작성중 오류를 검사하기 위한 출력코드를 프로그램에 삽입하였다가 프로그램 검사가 끝난 경우 출력문을 주우는 것을 조건부 컴파일을이용하면 다음과 같이 작성할 수 있다.

#define DEBUG 1

void main()

{

#if DEBUG == 1

    printf("program start\n);

#endif

    .....

}

 

  • 위와 같은 형식은 선택적 컴파일 또는 조건부 컴파일이라 한다.
  • 조건부 컴파일로 또 다른 지시자는 #ifdef, #ifndef, #endif로 매크로의 존재여부에 따라서 조건주 컴파일을 실행한다.
  • 매크로가 정의 되어 있을때 컴파일을 수행하고 #ifndef 는 매크로가 정의되어 있지 않을 경우 컴파일을 수행한다.

 

 

🔔 예) 값을 수시로 바꾸어야 할 때

 

🎯 프로그램 설명

  • DEBUG 를 #define 하지 않은 상태에서 컴파일시에 컴파일 명령어로 #define 하여 값을 변경할 수 있다.

 

🔔 예)

gcc -DDEBUG -o main main.c

 

실행 결과

 

 

🔔 예) make 파일 내부의 -D로 #define 되어 있는 값을 아래와 같이 리다이렉션으로 찾아낼 수 있다.

 

[aaa. txt 파일 내부]

 

  • -DF_CPU = 16000000UL 의 값을 찾기위해 make 파일을 열어 검색한다.

 

 

 

매크로 함수와 #undef

  • #define 지시자는 상수뿐만 아니라 함수도 정의할 수 있다.

#define 매크로 이름(인수) (문자열)

 

 

🔔 예) 매크로 함수의 사용 예

 

🎯 프로그램 설명

  • gcc --save-temps -main.c 로 main.i 파일을 생성하여main.i 파일 내부의 위 함수의 매크로 부분이 치환된 것을 볼 수 있다.
  • type검사를 하지 않기 때문에 잘 사용되지 않는다.

 

[main.i 파일 내부]

 

실행 결과

 

  • #undef 지시자는 정의된 매크로를 해제하는 지시자이다.
  • 동일한 매크로를 여러 번 정의하였을 경우, #undef을 이용하면 가장 최근에 정의한 것이 취소되고 그 바로 전의 정의가 효력을 갖는다.

#undef    매크로이름

 

  • 아래와 같이 사용한다.

#define PI    3.1416

#define PI    3.14

area1 = 5 * 5 * PI;

#undef PI

area2 = 5 * 5 * PI;

 

  • 이 경우 area1은 PI 값이 3.14로 계산되고, area2의 경우 PI값이 3.1416으로 계산된다.

 

 

 

 

728x90
반응형