본문 바로가기

Programming/C language

Chapter 16. 전처리기

전처리기


Compile 하기전에 선행 처리하는 구문 (CPU 연산 X, only compile time) 

어떤걸 처리하는가? -> 코드를 변형시킨다. 


#으로 시작한다. 


#include 

외부 file을 현재 Source code의 위에 포함해 함께 compile 하는 것 

~.h를 include 한 것은 그 code를 ~.c 위에 직접 작성한 것과 동일 


"~.h" : 헤더파일이 현재 디렉터리에 존재하는 경우 

<~.h> : 헤더파일이 컴파일러 설정에 따른 시스템 디렉터리에 존재하는 경우 


macro

한 행 혹은 여러 행으로 기술할 수 있는 구문 

자주 반복되며 길이가 짧은 코드를 함수로 만들면 코드를 보기는 쉽지만 오버해드가 크기때문에 사용


정의할 때 가장 바깥에 ( ) 를 빼면 우선순위와 같은 문제가 발생할 수 있다. 

또한 매개변수의 자료형이 정의되어있지 않기 때문에 예상치못한 버그가 발생할 수 있으므로 가급적 사용을 자제하자. 



__inline 함수

macro의 장점과 함수의 장점을 합친 것 

문법적으로 함수와 동일하지만 컴파일러의 판단하에 줄일 수 있다고 판단되면 함수 호출을 하지않게 코드를 변경한다. 


컴파일러가 자동으로 판단, 처리 하기에 굳이 신경 쓸 필요는 없다. 



매크로 특수화 연산자 #, ## 

# : 인수를 문자열로 만들어주는 연산자 

## : 두 매개변수를 한 덩어리로 묶어 코드를 만듬  ex) a##b = ab 



조건부 컴파일 

상수 정의에 따라 실제로 번역되는 소스코드가 달라지도록 구성하는 것 

#if xxx, #else, #endif ... 


문자열 처리 (unicode vs mbcs), 빌드 모드 (_DEBUG) 선택에 많이 쓰인다. 




연습문제)


1) 다음 매크로 정의의 문제점은 무엇인가? 


#define ADD(a, b) a + b


Q )


a + b 겉에 괄호가 없기에 ADD(a, b) * 2 와 같은 연산을 수행할 경우 우선순위 문제가 생길 수 있다. 

또한 printf("%d\n", ADD(3 + 4.5)); 처럼 자료형을 이상하게 넣을 경우에 warning 이나 error는 발생하지 않고 이상한 값을 출력하기도 한다. 



2) __inline 함수와 매크로의 공통점은 무엇인지 설명하세요. 



Q )


단순한 코드지만 자주 반복되는 코드를 일일이 입력하지 않고 함수처럼 보이게 사용할 수 있으며 그럼에도 불구하고 call stack이 없어 오버헤드도 존재하지 않아 성능상 함수에 비해 우월하다. 


하지만 매크로는 () 문제, 매개변수 문제등으로 인해 __inline함수 에 비해 뛰어난 점이 별로 없으므로 가급적이면 __inline함수를 사용하는것이 좋다.




- 출처 : 독하게 시작하는 C 프로그래밍 (최호성, 루비 페이퍼)