본문 바로가기

Application-level프로그래밍

(C) 전처리구문

잘못된 정보일 수 있다.(!)
표준 C 기호
__FILE__ 이 기호가 쓰인 파일의 경로/이름(문자열)
__LINE__ 이 기호가 쓰인 라인 넘버(정수)
__DATE__ 이 기호가 쓰인 날짜(문자열) (컴파일 시점)
__TIME__ 이 기호가 쓰인 시간(문자열) (컴파일 시점)
__STDC__ 표준 C 컴파일러를 따른 다면 1을 나타냄. 
__cplusplus C++ 컴파일러를 쓰면 1을 나타냄.


기초적인 전처리기 사용 예

#define PI 3.14     
 /*이 것이 쓰인 '이후'의 코드에서  PI라는 문자를 보면 3.14로 치환한다. 대문자로 선언해서 변수는 소문자로 사용되는 것과 구별. */
#define NAME "Gil-Dong"
// 문자열로 치환하는 예

#define PRINT printf("%d",1)
// 코드에서 PRINT 라는 문자를 보면  printf("%d",1) 로 치환한다. 이렇게 명령문을 이용하는 경우 세미콜론에 주의.
// 세미콜론은 자동으로 붙지 않는다. 말 그대로 치환이다.

#define SUN(x,y) ((x)*2+(y)*3)
// SUN(2+2,3+9)을 보면 ((x)*2+(y)*3)로 치환하되, x대신 2+2, y대신 3+9를 대입해놓는다.
// ()를 자주 쓰는 이유는 연산 우선순위를 확실히 정하기 위해서이다. 인자로써 수식이 들어가는 경우도 있기 때문이다.

#include "user1.h"
//경로가 주어지지 않은 파일이름을 쓴 경우는 현재 작업중인 디렉토리, 그 다음 시스템에 지정된 디렉토리를 찾는다.
//경로를 쓸 수도 있다는 점을 참고, 경로포멧은 OS가 사용하는 것의 포멧으로 추측. C:\user1.h 와 /home/user1/user1.h ..

#define PI  3
#undef PI
//  정의된 기호 PI를 이 다음(#undef PI 쓰인)부터 정의를 해제한다.


#define PI 3.1
#define E 2.7

#ifdef PI
  count=5; /*컴파일 됨*/
#else
  count=3; /*컴파일 안됨*/
#endif

#ifndef E
  count=3; /*컴파일 안됨*/
#else
  count=5;/*컴파일 됨*/
#endif


#define COUNT 5

#if COUNT>5 /*변수가 들어가지 않은 정수식. 물론 정의된 매크로는 사용가능하다.*/
  a++;
#elif COUNT==3 /* else if 라고 생각하면 된다.*/ 
  a=3*2
#else
  a--; /*이 경우만 컴파일됨*/
#endif /*#if 와 쌍을 이룰 뿐 아니라 #ifdef와 쌍을 이룬다는 것에 다시한번 주목*/