C 언어 개열/C 언어

선행처리기(Preprocessor)

본클라쓰 2010. 8. 22. 10:23

 

 선행처리(Preprocessor)는 소스 파일을 컴파일하기 전에 행해야 할 일련의 작업을 의미한다. 선행처릐 가장 대표적인 예는 #include 문에 의한 외부 파일의 포함 기능과 #define 문에 의한 매크고 상수 정의 기능이다.


 선행처리기 지시자들은 # 부호로 시작한다. # 앞에는 공백 문자를 제외한 다른 문자가 올 수 없다. 일반적으로 C언어 구문과는 다르게 취급하므로 명령의 끝에 ';'을 붙이지 않으며, 선행처리 지시문은 한 행에 작성하며, 두 행 이상 작성해야 할 경우 \을 사요하여 다음 행과 연결됨을 명시해야 한다.




#define 지시자


 소스 파일에서 이 식별자를 만날 때마다 이것을 대치할 문자 시퀀스(문자들의 집합)를 정의한다. 식별자를 마크로 이름(Macro Name)이라고 하며 이 대체 과정을 마크로 대체(Macro Replacement)라고 한다. 세미콜론을 사용하지 않으며, 식별자와 문자 시퀀스 사이에는 여러 개의 공란이 존재할 수 있지만, 일단 문자 시퀀스가 시작되고 나면, 뉴라인 문자에 의해서만 끝이 난다.




#include 지시자


 컴파일러에게 또 다른 소스 파일을 읽도록 명령한다. 추가 소스 파일의 이름은 인용부호 또는 각진 괄호(angle bracket)를 사용하는 데, 인용부호는 사용자 정의 파일리고 각진 괄호는 시스템 정의 파일명이다.


#include <stdio.h> // 시스템 정의 파일명
#include "test.txt" // 사용자 정의 파일명




#error 지시자


 #error 지시자는 컴파일러에게 컴파일 행위를 중지시킨다. 디버깅(Debugging)을 위해서 사용한다. 이 지시자를 만날 때는 컴파일러 생성자에 의해서 정의된 다른 정보와 함께 오류 메시지를 출력한다.


#error error_message


#include <stdio.h>

int main(void) {

    int a = 10;
    #error error test
    printf("Error 지시자 테스트 : %d \n", a);

    return 0;
}

**** Internal Builder is used for build               ****
gcc -O0 -g3 -Wall -c -fmessage-length=0 -osrc\CExcample.o ..\src\CExcample.c
..\src\CExcample.c:12:3: #error error test
Build error occurred, build is stopped
Time consumed: 615  ms. 




미리 정의된 마크로 이름


C언어에서는 5개의 미리 정의된 내정된 마크로 이름이 있다.

  • __LINE__ : 코드에서 현재 컴파일된 라인의 라인 번호
  • __FILE__ : 컴파일 될 소스 코드의 이름을 포함하는 문자열
  • __DATA__ : 월/일/년 형식의 문자열. 이 문자열은 소스 파일을 목적 코드로 변환하는 날짜를 표현한다.
  • __TIME__ : 소스 코드를 목적 코드로 변환하는 시간의 문자열. 이 문자열의 형식은 시:분:초
  • __STDC__ : 10진 상수 1을 포함하여, 특정 구현이 ANSI C 표준에 부합됨을 의미


#include <stdio.h>

int main(void) {
    printf("컴파일 정보: %s \n라인: %d \n날짜: %s \n시간: %s \n", __FILE__, __LINE__, __DATE__, __TIME__);
    return 0;
}



컴파일 정보: ..\src\CExcample.c
라인: 10
날짜: Aug 22 2010
시간: 10:11:23


'C 언어 개열 > C 언어' 카테고리의 다른 글

입출력  (0) 2010.08.22
Call by Value 와 Call by Address  (0) 2010.08.22
구조체(Structure)  (0) 2010.08.22
포인터(Pointer) 변수  (0) 2010.08.21
register 변수  (0) 2010.08.21