본문 바로가기

PL/C & C++

[C] C언어 전처리기

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