PL/C & C++

[C] C언어 전처리기

frieden1946 2020. 7. 9. 12:10

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