프로그래밍 언어/[ C ]

[ C ] 09. 전처리기 ( if, ifdef, elif, ifndef, define, endif )

kim.svadoz 2020. 8. 14. 09:54
728x90
반응형

[ 전처리기 ]


일반적인 if조건문과의 차이는 일반 if조건문이 FALSE일 경우, 실행이 되지 않을 뿐 컴파일은 된다면, #if가 0이라면 컴파일 자체가 되지않는다.

#include <stdio.h>
int main(){
    if(0){
        printf("실행되지는 않지만 컴파일은 됨\n");
    }

    #if 0
        printf("컴파일 자체가 안됨\n");
    #endif
        return 0;
}

=> 전처리기의 특성을 이용한 것이다. 전처리기는 실제 컴파일이 수행되기 전에 실행되어 소스에 치환되는 데 #if가 0일 경우에는 소스에 삽입 되지 않는다. 즉 #if는 if와 다르게 조건에 따라 소스코드를 삽입하거나 삭제하기 위해 사용되는 지시자이다.

#include <stdio.h>
#define NUM -3
int main(){
    #if NUM
        printf("if:NUM is %d\n", NUM);
    #lse
        printf("else: NUM is %d\n", NUM);
    #endif
}

// if값이 -3으로 음수인데도 #else가 아닌 #if를 탄다
# 실행 결과
if: NUM is -3

# if vs # ifdef

  • #ifdef의 def는 define의 약자이다. 즉 #if가 '만약라면' 이라는 뜻이라면 #ifdef는 '만약가 정의되어있다면'을 의미한다.
  • 만약 #ifdef A하면 A가 TRUE이던 FALSE이던 상관하지 않는다. #ifdef는 오로지 A가 사전에 정의되었느냐 안되었느냐만 확인하는 것이다. 반면 #if A는 A에 들어있는 값이 중요하게 작용한다.
#include <stdio.h>
#define A 0
int main(){
    #ifdef A
        printf("A is defined\n");
    #endif

    #if A
        printf("A is True\n");
    #else 
        printf("A is False\n");
    #endif
        return 0;
}
# 실행 결과
A is defined
A is False

# if 조건을 분기하는 # elif

  • 조건을 계속 분기할 수 있는 else if와 같은 역할이 지시자에도 있다 -> #elif
  • #ifdef는 정의되어 있냐 정의되어 있찌 않냐 이분법적으로만 나누기 때문에 #elif를 사용할 수 없지만 #if#elif를 사용할 수 있다.
#include <stdio.h>
#define NUM 2
int main(){
    #if NUM==1
        printf("NUM is 1\n");
    #elif NUM==2
        printf("NUM is 2\n");
    #elif NUM==3
        printf("NUM is 3\n");
    #else
        printf("NUM is %d\n", NUM);
    #endif
        return 0;
}
# 실행 결과
NUM is 2

# ifndef , #define, #endif

header파일의 중복을 막는 #ifndef

해당 구조체가 재선언 되지 않고 헤더파일의 중복선언을 막기 위해서 사용한다.

#ifndef __TW_MODEL_OSTRICH_H__
#define __TW_MODEL_OSTRICH_H__

#include ...

#endif
  1. TW_MODEL_OSTRICH_H이라는 상수가 선언되어 있는지 확인한다.
  2. 상수가 선언이 안되있다면, TW_MODEL_OSTRICH_H라는 상수를 선언한다
  3. header에 들어갈 내용이 작성된다.
  4. 만약에 TW_MODEL_OSTRICH_H라는 상수가 선언이 안되있다면, 그냥 해당 참조는 무시하게 된다.
  • 해당 TW_MODEL_OSTRICH_H이 이미 정의되어 있다면 #endif를 만날 때 까지 사이의 모든 코드를 무시하게 된다.

    => 이러한 메커니즘을 *"include guard"* 라고 부른다.

  • 이런 형태를 만들어서 중복참조를 막는데 header파일에서 #ifndef라는 전처리문을 사용하는 핵심이유가 된다.

728x90
반응형

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

[ C ] 11. 함수와 배열  (0) 2020.08.14
[ C ] 10. 함수와 포인터  (1) 2020.08.14
[ C ] 08. 구조체  (0) 2020.08.13
[ C ] 07. 열거형  (0) 2020.08.13
[ C ] 06. 포인터연산  (0) 2020.08.13