반응형

C언어에서 전처리 구문은 C 컴파일러가 컴파일을 하기전에 전처리기가 선행으로 처리되는 부분을 말합니다. 

C언어 작성된 프로그램(*.c)을 컴파일 할때에 전처리기는 전처리 구문을 해석하여 주석부를 없애고 전처리 구문을 처리한 *.i 파일을 임시로 생성합니다. 컴파일러는 *.i를 컴파일하여 assembler 소스 코드를 생성합니다. assembler는 assembler 소스를 처리하여 기계어 코드를 생성합니다. 기계어 코드를 다른 기계어 코드와 link하여 실행파일을 생성합니다.

 

C언어의 컴파일 과정은 아래의 순서로 수행합니다. 

 

컴파일 도중에 *.i 파일과 *.s 파일은 임시 파일로 생성된 후에 지웁니다.

이 임시파일을 지우지 않는 옵션은 gcc --save-temps 옵션으로 컴파일하면 임시 파일들이 그대로 남습니다. 

 

이 중에서 전치리 구문에 대해서만 알아보도록 합니다.

 

#include

#include <header file>
or
#include "header file"

대부분의 C언어 개발자라면 누구나 알고 있는 #include 전처리문입니다. 전처리기에게 다른 소스 파일(주로 header file) 전체를 #include 위치에 치환하도록 합니다.

#include는 #include 라인에 filename의 파일 내용을 모두 복사해 둔 것과 같습니다. 반드시 header 파일이 아니어도 됩니다.
#include <...>와 #include "..."는 약간의 차이가 있습니다.
#include <...>는 C언어 표준 header이거나 Compile option -I디렉토리명 으로 header 파일의 위치를 지정한 디렉토리에 있는 파일만 찾습니다.
#include "..."는 현재 디렉토리에서 파일을 먼저 찾고 없으면 -I로 설정된 directory 또는 표준 header file을 찾습니다.

 

 

#define

#define 매크로명
#define 매크로상수명 상수값
#define 매크로함수명(...) 매크로함수

전처리기에게 정의된 매크로 부분을 뒤의 값으로 치환하도록 합니다. #if defined() 전처리기 연산자나 #ifdef / #ifndef 등 함께 사용하여 소스에서 조건별 부분 컴파일을 위한 용도로 사용하거나 매크로 상수 정의, 매크로 함수 정의를 합니다.

 

ex1). 매크로정의

#define _DEBUG
#define __MYHEADER_H__

......

#ifndef _DEBUG 
printf("%20s:%25s:%05d:디버깅입니다.\n", __FILE__, __func__, __LINE__);
#endif

위의 printf( )부분은 #define _DEBUG가 있거나 컴파일시 -DDEBUG option을 주고 컴파일을 하면 printf( )부분이 활성화되어 출력이 됩니다.

 

ex2). 매크로상수 정의

#define PI 3.141592
#define LEN_FILPATH 1024

double radius = 20.0;
double circle_area = radius * radius * PI;

일반적으로 상수를 정의하는 방법에는 #define을 이용한 Macro 상수와 변수의 초기화 형태앞에 const를 붙이는 방법이 있는 데, #define으로 상수를 정의하면 컴파일 시의 전처리할 때에 PI를 3.141592로 치환합니다.

 

ex3). 매크로함수 정의

#define MAX(a, b) ((a) > (b) ? (a) : (b))

#define PRINT(a, b) printf("%s", a);  \
	printf(" = ");  \
	printf("%d\n")



long r1;
long r2;
long max;
...
max = MAX(r1, r2);
--> 전처리기는 소스를
max = ((r1) > (r2) ? (r1) : (r2));
로 변경해줍니다. ? : 연산자는 아는 내용이지요?

매크로 정의시 PRINT와 같이 한줄로 정의하기 힘든 경우에는 \로 라인을 끝내고 다음 라인으로 넘기면 됩니다.
그리고 매크로함수 정의 시 전처리기가 치환만하기 때문에 연산자 우선순위 등을 고려해서 반드시 ( )안에 정의를 해야 하며 파라미터 마다 ( )로 감싸야만 오류가 발생하지 않습니다.

 

#define MULT(a, b) a * b
로 매크로함수를 정의 하는 경우

long value = MULT(20 + 4, 5 - 6);
--> 전처리기가 치환한 결과는
long value = 20 + 4 * 5 - 6; 이 됩니다.


#define MULT(a, b) ((a) + (b))
로 매크로함수를 정의 하는 경우
long value = MULT(20 + 4, 5 - 6) * 20;
--> 전처리기가 치환한 결과는
long value = ((20 + 4) * (5 - 6)) * 20; 
이 되어 우리가 예상했던 대로 처리됩니다

 

 

#undef 

define된 매크로를 undefine 처리하여 매크로 정의를 무효화한다.

ex). 

#ifdef _VALUE_
    #undef _VALUE_
    #define _VALUE_ 2000
#else
    #define _VALUE_ 2000
#endif

위의 예는 _VALUE_를 무조건 2000으로 하고 싶다는 것입니다.

 

 

 

 

C Programming Language 문법

1. C 프로그래밍 언어는? 2. C언어 개발 환경 (실습 환경) 3. C언어의 컴파일 과정 4. C 소스 파일 구성 5. 주석문(Comment) 6. 식별자 명명 규칙 7. C 프로그래밍의 시작 - 함수 8. 변수와 상수 (정수형) 9. 변..

www.it-note.kr

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,