반응형
[ 전처리기 ]
일반적인 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
- TW_MODEL_OSTRICH_H이라는 상수가 선언되어 있는지 확인한다.
- 상수가 선언이 안되있다면, TW_MODEL_OSTRICH_H라는 상수를 선언한다
- header에 들어갈 내용이 작성된다.
- 만약에 TW_MODEL_OSTRICH_H라는 상수가 선언이 안되있다면, 그냥 해당 참조는 무시하게 된다.
-
해당 TW_MODEL_OSTRICH_H이 이미 정의되어 있다면
#endif
를 만날 때 까지 사이의 모든 코드를 무시하게 된다.=> 이러한 메커니즘을 *"include guard"* 라고 부른다.
-
이런 형태를 만들어서 중복참조를 막는데 header파일에서
#ifndef
라는 전처리문을 사용하는 핵심이유가 된다.
반응형
'프로그래밍 언어 > [ 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 |