2011-1 학기프로그래밍입문 (1) 참고자료 : chapter 8-1. 전처리 박종혁 Tel: 970-6702 Email: jhpark1@seoultech.ac.kr h k 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- ehanbit.net
전처리명령어 컴파일과정에는전처리 (preprocessing) 단계가있다. - 컴파일러는목적파일을만들기전에전처리라고하는특별한작업을 먼저수행한다. - 전처리과정에서소스파일에다른파일의텍스트를포함시키거나일부문장을다른문장으로바꾸는작업등을수행한다. - 전처리명령어는 # 기호로시작한다. - 전처리가끝난파일역시소스파일과마찬가지로텍스트파일이다. 한빛미디어 -2- ehanbit.net
include 명령으로파일을포함한다. include명령은원하는파일을특정디렉토리에서찾아서명령어가사용된곳에포함시킨다. - 꺽쇠괄호는포함할파일을컴파일러에설정되어있는특정디렉토리에서찾는다. VC++6.0 컴파일러에설정되어있는 include 디렉토리 - 큰따옴표는포함할파일을우선현재의작업디렉토리에서찾고해당파일이존재하지않으면컴파일러에설정되어있는디렉토리에서찾는다. #include c: user myheader.h // 포함할파일의위치를직접지정할때사용한다. 한빛미디어 -3- ehanbit.net
include 명령으로파일을포함한다. 헤더파일을사용하면프로그램을깔끔하고편리하게작성할수있다. - 여러프로그램에서공통적으로사용하는구조체나함수또는외부변의선언을헤더파일로만들어놓고각프로그램에서간단히포함하여사용한다. myheader.h 로작성하여현재의작업디렉토리에저장해둔다. 한빛미디어 -4- ehanbit.net
define 명령어로매크로상수를만들자. define 명령어는매크로명을정의하여복잡한상수나문장을의미있는단어로사용할수있도록한다. - 컴파일러는전처리과정에서프로그램에서사용된매크로명을확장문자열로치환한다. #include <stdio.h> // 이곳에는 stdio.h 헤더파일의내용이포함된다. #define PI 3.14159 전처리후 double radius; double radius; printf(" 원의반지름을입력하세요 : "); printf(" 원의반지름을입력하세요 : "); scanf("%lf", &radius); scanf("%lf", &radius); printf(" 원의둘레 : %lf n", 2*3.14159*radius); printf(" 원의둘레 : %lf n", 2*PI*radius); printf(" 원의면적 : %lf n", 3.14159*radius*radius); printf(" 원의면적 : %lf n", PI*radius*radius); return 0; // 매크로명이상수값으로치환 return 0; 한빛미디어 -5- ehanbit.net
문장으로치환되는매크로명 매크로명은복잡한수식이나문장에도사용할수있다. #define INTRO Perfect C Language & Data Structure 여러줄에걸쳐사용할때는백슬래시를사용하여연결시킨다. printf( Introduction => %s, INTRO); printf( Introduction => %s, Perfect C Language & Data Structure ); - 매크로명은복잡한숫자나문자열등을의미있는단어로표현함으로써프로그램을읽기쉽게해주고매크로명의수정이쉬우므로유지보수에도움이된다. 한빛미디어 -6- ehanbit.net
여러가지매크로명을사용한프로그램 #include <stdio.h> #define PI 3.14159 // 매크로상수정의 #define LIMIT 100.0 // 매크로상수정의 #define MSG "passed!" #define ERR_PRN printf(" 범위를벗어났습니다! n") // 문자열을매크로명으로정의 // 출력문을매크로명으로정의 double radius, area; printf(" 반지름을입력하세요 : "); scanf("%lf", &radius); // 반지름입력 area=pi*radius*radius; // 면적계산 if(area>limit) // 면적이한계값을넘으면 ERR_PRN; // 에러메시지를출력한다. else printf(" 원의면적 :%2lf(% %.2lf (%s) n", area, MSG); return 0; // 그렇지않으면면적과문자열출력 한빛미디어 -7- ehanbit.net
define 명령어로매크로함수를만들자. 동일한수식이나문장에대하여경우에따라각각다른값으로확장될수있도록만든것이매크로함수이다. - 전처리과정에서전달인자에따라서로다른문자열로확장된다. #define SUM(x, y) x+y int x=10, y=20; int a=100, b=200; printf( x+y = %d n, SUM(x, y)); printf( a+b = %d n, SUM(a, b)); 한빛미디어 -8- ehanbit.net
매크로함수사용할때주의할점 매크로함수는확장후에다른연산자와의추가적인연산에의해서부작용이생길수있다. #define MUL(x, y) x*y printf( %d n, 30/MUL(2, 5)); // 전처리되기전의코드 printf( %d n, 30/2*5); // 전처리된이후의코드 나눗셈이먼저연산된다! 확장후의부작용을막기위해서확장문자열에괄호를사용한다. #define MUL(x, y) ((x)*(y)) // 확장문자열의각문자를모두괄호로감싼다. printf( %d n, 30/MUL(2, 2+3)); printf( %d n, 30/((2)*(2+3))); 한빛미디어 -9- ehanbit.net
매크로함수를활용한프로그램 #include <stdio.h> #define PI 3.14159 #define SQUARE(x) ((x)*(x)) // 매크로상수정의 // 제곱을구하는매크로함수정의 double radius; printf(" 반지름을입력하세요 : "); scanf("%lf", &radius); printf(" 원의면적은 : %.2lf", PI*SQUARE(radius)); return 0; // 매크로상수와매크로함수를사용하여원의면적을구한다. 한빛미디어 -10- ehanbit.net
조건부컴파일전처리명령어 조건부컴파일은프로그램코드를조건에따라선택적으로컴파일할수있도록전처리단계에서걸러준다. 명령어에는 if, else, elif, ifdef, ifndef, endif 등이있다. - 조건식에괄호가필요없으며반드시 #endif 로끝을표시해준다. - 형식1 : if선택문의 if~else if~else구문과처리방식이같다. - 형식2 : 매크로명의정의에따라문장을선택적으로컴파일한다. - 형식3: 매크로명이정의되지않았을때선택적으로컴파일한다. 한빛미디어 -11- ehanbit.net
조건부컴파일을사용한예 #include <stdio.h> #define TC #ifdef TC #include <conio.h> #define MAX_INT 32767 #else #define MAX_INT 2147483647 #endif int m=max_int; #ifdef TC clrscr(); #endif printf("maximum value => %d n", m); #ifdef TC getch(); #endif return 0; 조건부컴파일이수행되면 #include <stdio.h> #define TC #include <conio.h> #define MAX_INT 32767 int m=max_int; clrscr(); printf("maximum value => %d n", m); getch(); return 0; 한빛미디어 -12- ehanbit.net
헤더파일의중복포함을해결하자. 조건부컴파일을사용하면헤더파일의포함관계가복잡해질때자신의헤더파일을다시포함하는문제를해결할수있다. personal.h 헤더파일이중복되는예 한빛미디어 -13- ehanbit.net
헤더파일의중복포함을해결하자. 헤더파일의선두에조건에따라특정매크로명을정의하여같은헤더파일이두번이상포함되지못하도록만든다. 두번째포함될때는 PERSONAL 이정의되어있으므로매크로가확장되지않는다!! 한빛미디어 -14- ehanbit.net
const 를사용한기호상수 변수에 const 를사용하면상수화되므로변수를기호상수처럼사용 할수있다. - const를사용하여변수를상수화시키면그값을바꿀수없으므로반드시선언과동시에초기화해야한다. #include <stdio.h> const double Tax_Rate=0.12; int income; // 세율을 12% 로고정시킨다. // 소득액을저장할변수 printf( 소득액을입력하세요 : ); scanf( %d, &income); printf( 세금은 : %.1lf 입니다. n, income*tax_rate); return 0; // Tax_Rate 는상수와같이사용된다. 한빛미디어 -15- ehanbit.net