강좌 & 팁
프로그램의 실행과 오류
1. 선행처리기
선행처리기 (preprocessor)는 원시프로그램을 컴파일하기 전에 필요한 처리를 하는 처리기이다. 선행처리기의 기능은 프로그램내의 매크로 정의를 처리하고, 헤더파일을 원시 프로그램내에 포함시키고, 조건부 컴파일을 실행한다.
선행처리기에 대한 명령어는 선행처리기 지시자 (preprocessor directives)라고 하여 C 언어와는 별개의 명령문이다.
선행처리지시자는 '#' 으로 시작되어 예전에는 첫 번째 칼럼에서 시작해야 하는 제약이 있었으나, ANSI C에서는 이 규정을 없앴다.
아직 컴파일러에 따라서는 첫 번째 칼럼에만 허용하는 경우도 있으나 최근의 컴파일러는 이 제약이 없이 프로그램내의 어느 부분에도 올 수 있다.
지시자의 효력은 프로그램내에 명시적 해제 명령이 없는 한 유효하다.
지금까지 사용한 지시자로는 #include 와 #define 이 있고, 그밖에도 조건부 컴파일을 위한 지시자가 있다.
1.1 #include 지시자
#include 지시자는 컴파일 하기 전에 원시프로그램의 헤더파일 이름을 실제의 헤더파일로 교체하라는 명령으로, 다음과 같이 2가지 형식이 있다.
#include <파일이름>
#include "파일이름"
첫 번째 형식은 헤더파일을 시스템 디렉토리에서 찾고, 두 번째 형식은 현재의 사용자 디렉토리에서 헤더파일을 찾아보고 없으면 시스템 디렉토리를 검사한다. 첫 번째 형식은 보통 시스템에서 제공하는 헤더파일을 명시할 때 사용하며, 두 번째 형식은 사용자가 만든 헤더파일을 명시할 때 사용한다.
다음의 예제로 알아보도록 하자
[main.c]
#include <size_def.h>
int main()
{
int area;
area = LEFT * RIGHT;
prntf ( "Area is %d \n", area);
return 0;
}
[size_def.h]
#define LEFT 30
#defien RIGHT 40
main.c와 size_def.h 가 선행처리기를 거쳐서
#define LEFT 30
#defien RIGHT 40
int main()
{
int area;
area = LEFT * RIGHT;
prntf ( "Area is %d \n", area);
return 0;
}
위처럼 되는 것이다.
컴파일시 gcc 옵션으로 --save -temps 컴파일시 생성되는 중간 파일을 볼 수 있는데 전처리 파일인 .i 파일을 확인해 보면
로 확인해 볼 수 있다.
1.2 #define 지시자
#define 지시자는 임의의 상수나 함수에 이름을 준다. 사용형식은 다음과 같다.
#define 매크로이름 상수
매크로의 이름은 소문자를 사용해도 무방하지만 보통 알아보기 쉽게하기 위해서 대문자를 사용한다. 상수는 숫자나 문자 또는 문자열 상수가 될 수 있다. 사용의 예는 다음과 같다.
#defien MAXIMUM 1000
#define MINIMUM 100
선행처리기가 #define 지시자를 실행했을 때 원시 프로그램의 변화를 다음의 예제로 확인해 보자
#define PI 3.14
int main()
{
int circle1 = 10;
int circle2 = 20;
float area1,area2;
area1 = circle1 * circle1 * PI;
area2 = circle2 * circle2 * PI;
printf("area1 is %f\n",area1);
printf("area2 is %f\n",area2);
return 0;
}
선행처리기를 거치게 되면
int main()
{
int circle1 = 10;
int circle2 = 20;
float area1,area2;
area1 = circle1 * circle1 * 3.14;
area2 = circle2 * circle2 * 3.14;
printf("area1 is %f\n",area1);
printf("area2 is %f\n",area2);
return 0;
}
가 되는 것이다.
마찬가지로 전처리 파일을 확인해 보면