19. 전처리와분할컴파일 순천향대학교컴퓨터학부이상정 1 학습내용 전처리명령어 #include #define 기호상수 const 분할컴파일 순천향대학교컴퓨터학부이상정 2
전처리과정 전처리 (preprocessor) 전처리명령어는 # 기호로시작 #incldue #define 순천향대학교컴퓨터학부이상정 3 #include (1) 지정된파일을프로그램에삽입 꺽쇠괄호는포함할파일을컴파일러에설정되어있는특정디렉토리에서검색 큰따옴표는포함할파일을우선현재의작업디렉토리에서찾고해당파일이존재하지않으면컴파일러에설정되어있는디렉토리에서검색 #include c: user myheader.h // 포함할파일의위치를직접지정할때사용한다. 순천향대학교컴퓨터학부이상정 4
#include (2) 헤더파일을사용하면프로그램이간결 여러프로그램에서공통적으로사용하는구조체나함수또는외부변의선언을헤더파일로작성 myheader.h로작성하여현재의작업디렉토리에저장해둔다. 순천향대학교컴퓨터학부이상정 5 #define 복잡한상수나문장을매크로명 ( 심볼기호 ) 으로정의 컴파일러는전처리과정에서프로그램에서사용된매크로명을확장문자열로치환 #define PI 3.14159 전처리후 double radius; printf(" 원의반지름을입력하세요 : "); scanf("%lf" %lf, &radius); printf(" 원의둘레 : %lf n", 2*PI*radius); printf(" 원의면적 : %lf n", PI*radius*radius); 순천향대학교컴퓨터학부이상정 6 // 이곳에는 stdio.h 헤더파일의내용이포함된다. double radius; printf(" 원의반지름을입력하세요 : "); scanf("%lf", &radius); printf(" 원의둘레 : %lf n", 2*3.14159*radius); printf(" 원의면적 : %lf n", 3.14159*radius*radius);
#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 (%s) n", area, MSG); 순천향대학교컴퓨터학부이상정 7 #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
매크로함수부작용 매크로함수는확장후에다른연산자와의추가적인연산에의해서부작용발생할가능성이있으므로확장문자열에괄호사용 #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, 5)); printf( %d n, 30/((2)*(5))); 순천향대학교컴퓨터학부이상정 9 매크로함수예 #define SQUARE(x) ((x)*(x)) // 제곱을구하는매크로함수정의 int data = 3; printf("1. SQUARE(data) : %d n", SQUARE(data)); printf("2. SQUARE(++data): %d n", SQUARE(++data)); 순천향대학교컴퓨터학부이상정 10
조건컴파일 조건컴파일은프로그램코드를조건에따라선택적으로컴파일할수있도록전처리단계에서처리 if, else, elif, ifdef, ifndef, endif 순천향대학교컴퓨터학부이상정 11 #define TC 조건컴파일예 조건부컴파일이수행되면 #ifdef TC #include <conio.h> #define MAX_INT 32767 #else #define MAX_INT 2147483647 #define TC #endif #include <conio.h> #define MAX_INT 32767 int m=max_int; #ifdef TC clrscr(); int m=max_int; #endif clrscr(); printf("maximum value => %d n", m); #ifdef TC printf("maximum value => %d n", m); getch(); getch(); #endif 순천향대학교컴퓨터학부이상정 12
헤더파일중복예 (1) personal.h 헤더파일이중복되는예 순천향대학교컴퓨터학부이상정 13 헤더파일중복예 (2) 두번째포함될때는PERSONAL이정의되어있으므로매크로가확장되지않는다!! 순천향대학교컴퓨터학부이상정 14
const 를사용한기호상수 (1) 변수에 const 를사용하면상수화되므로변수를기호상수처럼사용 const를사용하여변수를상수화시키면그값을바꿀수없으므로반드시선언과동시에초기화 const double Tax_Rate=0.12; int income; printf( 소득액을입력하세요 : ); scanf( %d, &income); printf( 세금은 : %.1lf입니다. n, income*tax_rate); 순천향대학교컴퓨터학부이상정 15 const 를사용한기호상수 (2) 포인터변수에 const 가붙으면가리키는기억공간의값을고정 int a=10, b=20; const int *ap=&a; // 포인터변수는 a를가리킨다. printf( 변수 a 의값 : %d n, *ap); ap=&b; // 포인터변수로 b를가리키게할수도있다. printf( 변수b의값 :%d n, *ap); *ap=100; // ap 가가리키는변수 b 의값을 100 으로바꿀수없다!! 가인수선언시 const 변수를사용하여함수내에서값이변경되지않도록보장 printf( 홍길동 ); int printf(const char *format, ); // 함수의호출 // 함수의원형 순천향대학교컴퓨터학부이상정 16
분할컴파일 분할컴파일 하나의프로그램을여러개의파일 ( 모듈 ) 로분할하여작성 각파일을각각컴파일한후에링크시켜서하나의실행프로그램생성 분할컴파일을하면여러사람이나누어작성할수있고모듈별로에러를수정할수있으므로프로그램의생산성이향상 순천향대학교컴퓨터학부이상정 17 // a.c 파일 void input_value(int *, int *); void print_value(int, int); void exchange(int *, int *); int a, b; 분할컴파일예 1 (1) void input_value(int *ap, int *bp) printf(" 두정수값을입력하세요 :"); scanf("%d%d", ap, bp); input_value(&a, &b); print_value(a, b); exchange(&a, &b); print_value(a, b); 순천향대학교컴퓨터학부이상정 18
분할컴파일예 1(2) // b.c 파일 void print_value(int x, int y) printf(" 두정수값 : %d, %d n", x, y); void exchange(int *ap, int *bp) int temp; temp = *ap; *ap = *bp; *bp = temp; 순천향대학교컴퓨터학부이상정 19 // C a.c 프로그래밍파일활용 void input_value(); void print_value(); void exchange(); int a, b; // 외부변수의정의 input_value(); print_value(); exchange(); print_value(); void input_value() printf(" 두정수값을입력하세요 :"); scanf("%d%d", &a, &b); 순천향대학교컴퓨터학부이상정 20 분할컴파일예 2 // b.c 파일 extern int a, b; // 외부변수참조 void print_value() printf(" 두정수값 : %d, %d n", a, b); void exchange() int temp; temp = a; a = b; b = temp;
과제 1 매크로명 PI 를 3.141592 와원의면적을계산하는매크로 AREA(r) 를정의하여, 반지름 r을입력받아원의면적을계산하는프로그램을작성하라. #define PI 3.141592 #define AREA(r) 순천향대학교컴퓨터학부이상정 21 과제2(1) 앞의구조체과제 18-2-2 를수정 학생 n 명의학번, 국어, 영어, 수학점수를파일로부터입력받아총 점과평균을화면에성적순으로출력하는프로그램을작성하라. 단, 프로그램파일은다음과같이 3 개의파일로분리하여작성한다. score.h #include <string.h> #include <stdlib.h> struct student char *name; int num; int scores[3]; int total; double average; ; 순천향대학교컴퓨터학부이상정 22
과제2(2) a.c #include "score.h" void input_score(); void output_score(); struct student p[60]; int n; input_score(); output_score(); 순천향대학교컴퓨터학부이상정 23 b.c #include "score.h" extern struct student p[60]; extern int n; void input_score() void output_score()