1) 조건부 컴파일
전처리문이므로 컴파일되기 전에 조건을 평가하며 코드를 컴파일 대상에 포함시키거나 제외시키는 역할을 한다. 이때 조건의 형태는 여러 가지가 있지만 주로 매크로 상수의 존재 여부나 값에 대한 평가식이 사용된다.
#ifdef, #ifndef
2) #if
if는 매크로의 값을 평가하거나 여러 가지 조건을 결합하여 컴파일 여부를 결정하는 좀 더 복잡한 전처리문이다
#if 조건1
코드1 // 조건1을 만족하면 코드1을 컴파일
#elif 조건2
코드2 // 조건 2가 만족되면 코드2를 컴파일
#else
코드3 // 둘 다 맞지 않으면 코드 3을 컴파일
#endif
(1) 상등, 비교 연산자 사용이 가능하다.
==, != , >, <, >=, <=
(2) 비교 대상은 정수 상수만, 실수, 문자열은 안됨
(3) 논리 연산자 사용 가능
&&, ||, !
ex) #if (LEVEL == 8 && VER != 3)
(4) defined 연산자로 매크로의 존재 여부를 평가 할 수 있다.
ex) #if (LEVEL == 8 || defined(PROFESSIONAL))
ex) #if (defined(_DX_8) || defined(_DX_9))
#undef
#define으로 이미 정의된 매크로를 무효화한다.
라고 하면 앞으로 사용되는 ADD(…)는 ‘undefined symbol’이 되어 에러 처리 된다.
#ifdef와 #if defined의 차이
#ifdef는 정의가 되어 있는지를 테스트 하기 때문에, 한번에 여러 개를 사용할 수 없다. 형식이
처럼, 하나의 토큰이 되어야 하기 때문이다.
여러 개가 정의되어 있는지를 테스트 하기 위해서는
처럼 사용한다.
#if는 ||로 중첩해서 사용할 수 있다. 형식이, #if expression이므로, C 표현이 올 수 있다.
처럼 사용해도 된다.
#ifdef ~ #endif
컴파일 할 때
와 같이 쓰면 BASE는 상수 2로 치환되어 전처리기가 컴파일러에게 넘겨준다.
#define STDIO_H_
왜 뒤에 _를 붙였을까? 이것도 하나의 암시적 약속이다. 컴파일러 제작회사는 매크로를 정의할 때 사용자들과 이름이 충돌이 나지 않게 하기 위해서 대부분 _를 뒤어 덧붙인다. 또한 _를 하나 혹은 두 개 연속으로 시작하는 것은 컴파일러 내부에서 사용하는 매크로라는 성격이 강하다. 물론 강제적인 뜻은 없으며 단지 관습상 그렇다. 왜 이것이 관습이 되었나 하면 보통 매크로 변수 이름이나 함수 이름을 지을 때 뒤에 _를 붙이지 않기 때문이다. 그래서 함수 제작자들이 _를 단골로 붙였다.
전처리문의 종류(#include, #define, #ifdef, ... )
전처리문이란? 실질적인 컴파일 이전에 미리 처리되는 문장을 가리킨다. 선행처리기라고도 한다. 따라서 컴파일러는 사용자가 작성한 코드를 컴파일하기 전에 전처리문에서 정의해 놓은 작업��
sarghis.com
C언어 전처리기(#if, #else, #endif, #ifdef, #ifndef, #undef)
* C에서의 전처리기(Preprocessor)에 대해서는 맨처음 #include를 언급했었다. 이후 #define에 대해서도 ...
blog.naver.com
'PL > C & C++' 카테고리의 다른 글
[C] 변수형 출력 (0) | 2020.07.21 |
---|---|
[C] 배열 초기화 (0) | 2020.07.20 |
[C] union, struct (0) | 2020.07.20 |
[C/C++] ifdef (0) | 2020.07.16 |
[C++] 입력 받기 (0) | 2020.07.08 |