제10장 전처리기 문봉근
제10장 전처리기 10.1 #include 10.2 #define 10.3 #undef 10.4 #if, #else, #elif, #endif 10.5 #ifdef, #ifndef 10.6 #error, #line
전처리기 명령어 전처리기는 원시코드가 컴파일되기 전에 C언어의 문법과는 독립적으로 실행시켜 매크로(macro) 문장이 있으면 정의된 문장으로 치환해주는 역할을 담당한다.
10.1 #include 예제 10.1 #include 사용 예 #include <stdio.h> #include <conio.h> #include "my.h" #include "a:\max.h" void main(void) { ..... ...... }
예제 10.2 factorial 구하는 프로그램 // factorial.h #define ONE 1 int factorial(int n) { if (n > ONE) return(n*factorial(n-1)); else return(ONE); } // factorial.c #include <stdio.h> #include "factorial.h" void main(void) int num; scanf("%d", &num); printf("%d != %d",num,factorial(num)); 실행결과 3 3!= 6
10.2 #define 문법 (1) #define 매크로명 문자열 또는 상수
예제10.3 인수를 포함하지 않는 매크로 정의 프로그램 설명 #define MAX 20 #define TRUE 1 #define FALSE 0 #define PI 3.141592 #define BASE 256 #define EOF -1 설명 프로그램내에 MAX라는 부분은 컴파일 하기 전에 20으로 전부 치환된다. 마찬가지 이유로, TRUE는 1, FALSE는 0, PI는 3.141592, BASE는 256, EOF는 -1 등으로 치환된다.
예제10.4 인수를 포함하는 매크로 정의 프로그램 설명 예제10.4 인수를 포함하는 매크로 정의 프로그램 #define MAX(x,y) ( ((x)>(y)) ? (x) : (y) ) #define ADD(a,b) ((a)+(b)) #define MUL(a,b) ((a) * (b)) #define PRINTD(dt) printf("%d\n",dt); 설명 프로그램내에 MAX(1st, 2nd)이와 같은 형태로 되어 있는 부분이 있다면 전처리기는 ( ((1st)>(2nd)) ? (1st) : (2nd) ) 으로 치환한다. 두 번째, ADD(1st, 2nd)와 같은 형태의 문장이 있다면 ( (1st) + (2nd) )로 치환한다. 세 번째와 네 번째도 마찬가지 방법으로 치환시킨다.
예제10.5 매크로 치환이 일어나지 않는 예 프로그램 실행결과 #include <stdio.h> 예제10.5 매크로 치환이 일어나지 않는 예 프로그램 #include <stdio.h> #define TRUE 1 #define MAX(x,y) ( ((x)>(y)) ? (x) : (y) ) void main(void) { char str[] = "MAX(3,5)"; printf("%s, TRUE \n", str); } 실행결과 MAX(3, 5), TRUE
예제10.6 괄호를 사용하지 않아서 문제가 발생한 매크로 정의 #include <stdio.h> #define ADD(x) x+x void main(void) { int a, b = 4; a = ADD(b) / 2; printf("a = %d\n", a); } 실행결과 a = 6
예제10.7 괄호를 충분히 사용한 매크로 정의 #include <stdio.h> #define ABS(x) ((x<0)? -(x):(x)) #define MAX(x,y) ((x<y)? y:x) #define MIN(a,b) ((a<b)? a:b) #define ADD(x) (x+10) void main(void) { int i = -10; float j = 10.666; printf("%3d %f\n", ABS(i), ABS(j)); printf("%3d \n", (int)MAX(i,j)); printf("%3d \n", ADD(ABS(i))*2); } 실행결과 10 10.666000 10 40
예제10.8 두 수를 입력받아 큰 수를 찾아내고 이 두 수를 이용하여 사칙연산을 수행하는 프로그램 #include <stdio.h> #include <conio.h> #define MAX(a,b) (((a)>(b))?(a):(b)) #define MUL(a,b) a*b #define DIV(a,b) a/b #define ADD(a,b) a+b #define SUB(a,b) a-b #define PRINTD(dt) printf("%d\n",dt); void main(void) { int a,b,mu,di,ad,su,max; printf("input(a,b) :"); scanf("%d %d",&a,&b); max = MAX(a,b); mu = MUL(a,b); di = DIV(a,b); ad = ADD(a,b); su = SUB(a,b); PRINTD(max); PRINTD(mu); PRINTD(di); PRINTD(ad); PRINTD(su); getch(); } 실행결과 input (a, b) : 12 4 12 48 3 16 8
10.3 #undef 프로그램내에서 정의된 매크로를 해제하기 원할 때가 있다. #undef는 이미 정의된 매크로 정의를 해제할 때 사용한다. 문법 #undef 매크로명
예제10.9 매크로로 선언한 부분을 #undef 로 해제하는 프로그램 #include <stdio.h> #include <conio.h> #define SIZE 100 #define PRINTD(dt) printf("%d\n",dt); void main(void) { int a,b,c; a=SIZE; PRINTD(a); #define SIZE 200 b=SIZE; PRINTD(b); #undef SIZE #define SIZE 300 c=SIZE; PRINTD(c); getch(); } 실행결과 100 200 300
10.4 #if, #else, #elif, #endif 문법 #if 조건식 1 블록 1; 조건식 1이 참일때 블록2 ; 조건식 1이 거짓이고 2가 참일때 #else 블록 3; 조건식 1,2가 거짓일 때 #endif 블록조건식의 끝을 나타내는 문장
예제 10.10 C 프로그램을 전처리기가 처리한 예로써 실행결과에 나온 프로그램을 컴파일러가 실행파일로 만들게 된다. #define MIN 5 #define MAX 500 void main(void) { int i, j, p; i = 10; j = 20; p = 0; while(p == 0){ #if MIN < 10 j = 1000; #else j = 50; #endif p++; } #if MAX > 200 j = 5; } 실행결과 void main(void) { int i, j, p; i = 10; j = 20; p = 0; while(p == 0){ j = 1000; p++; } j = 5; }
예제 10.11 조건부 컴파일을 이용한 프로그램 #include <stdio.h> #include <conio.h> #define TRUE 1 #define FALSE 2 #define EQUAL 3 #define CONDITION TRUE #define EQ == void main(void) { #if CONDITION EQ TRUE printf(" CONDITION is TRUE\n"); #elif CONTION EQ FALSE printf("CONDITION is FALSE\n"); #else printf("CONDITION is EQUAL\n"); #endif getch(); } 실행결과 CONDITION is TRUE
10.5 #ifdef, #ifndef #ifdef는 매크로가 지정되어 있는 경우에 수행하고
예제 10.12 매크로가 정의되었는지를 알아보는 프로그램 #include <stdio.h> #include <conio.h> #define MAX 100 void main(void) { #ifdef MAX printf("MAX = %d\n",MAX); #endif #ifdef MIN printf("%d\n",MIN); #else printf("MIN is not defined !"); getch(); } 실행결과 MAX = 100 Min is not defined!
예제 10.13 조건부 컴파일을 이용한 프로그램 #define DEBUG #include <stdio.h> void func(int a, int b) { int c; c=(a++)+(b++); #ifdef DEBUG printf("i=%d, j=%d, c=%d\n",a,b,c); #endif } void main(void) int i,j; printf("i=%d, j=%d\n", i, j); i=5; j=8; func(i, j); 실행결과 I = 858993460, j = 858993460 I = 6, j = 9, c = 13
10.6 #error, #line 문법 #error "메시지......"
예제 10.14 #error을 이용하는 예 #include <stdio.h> #include <conio.h> #define MAX 100 #define MIN 101 void main(void) { #if MIN > MAX #error "MIN > MAX" #endif }
10.6 #error, #line(계속) 문법 #line 줄번호 "파일명" 컴파일러에게 지시하는 명령어로 줄번호를 바꾸고 파일명도 바꿔서 출력하라는 지시이다.
예제 10.15 #line을 이용하는 예 #include <stdio.h> #include <conio.h> #define MAX 100 #define MIN 101 void main(void) { int a, b; a = 5; b = a*a; a = int; #line 100 "error.c" b = (a - 5; printf("a = %d, b = %d \n", a, b); }