C언어 프로그래밍의 이해 Ch13. 선행처리기와 주석문
Ch13. 선행처리기와 주석문 목차 13.1 선행처리기 13.2 #define 13.3 #include 2
13.1 선행처리기(Preprocessor) 선행처리(Preprocessing) Ch13. 선행처리기와 주석문 13.1 선행처리기(Preprocessor) 선행처리(Preprocessing) 소스 파일을 컴파일하기 전에 행해야 할 일련의 작업을 의미 선행처리의 가장 대표적인 예는 #include문에 의한 외부 파일의 포함 기능과 #define문에 의한 매크로 상수 정의 기능 선행처리기 지시자 선행처리기 지시자들은 #부호로 시작 # 앞에는 공백 문자를 제외한 다른 문자가 올 수 없음 일반적인 C 언어 구문과는 다르게 취급하므로 명령의 끝에 ‘;’을 붙이지 않음 선행처리 지시문은 일반적으로 한 행에 작성하며, 두 행 이상 작성해야 할 경우는 ‘\’을 사용하여 다음 행과 연결됨을 명시 #if #include #ifdef #define #ifndef #undef #else #line #elif #error #endif #pragma 3
Ch13. 선행처리기와 주석문 13.2 #define #define 지시자 소스 파일에서 이 식별자를 만날 때마다 이것을 대치할 문자 시퀀스(즉, 문자들의 집합)를 정의 식별자를 마크로 이름(macro name)이라고 하며 이 대체 과정을 마크로 대체(macro replacement) 세미콜론을 사용하지 않음. 식별자와 문자 시퀀스 사이에는 여러 개의 공란이 존재할 수 있지만, 일단 문자 시퀀스가 시작되고 나면, 이것은 뉴라인 문자에 의해서만 끝내야 한함 만일 값 1을 단어 TURE로, 그리고 값 0을 FALSE로 사용하고자 한다면, 다음과 같은 2개의 마크로 #define을 사용 #define macro_name char-sequence #define TRUE 1 #define FALSE 0 4
Ch13. 선행처리기와 주석문 13.2 #define #define 지시자 컴파일러가 소스 파일에서 TURE 또는 FALSE를 만날 때마다, 각각 1 또는 0으로 대체함 다음은 화면에 0 1 2를 출력 일단 마크로 이름이 정의되고 나면, 이것은 다른 마크로 이름 정의의 일부로 사용될 수도 있음 다음 코드는 ONE, TWO, THREE의 값들을 정의 printf("%d %d %d", FALSE, TRUE, TRUE+1); #define ONE 1 #define TWO ONE+ONE #define THREE ONE+TWO 5
13.2 #define #define 지시자 마크로 대체는 특정 식별자를 이것에 연관된 문자 시퀀스로 간단히 대체 Ch13. 선행처리기와 주석문 13.2 #define #define 지시자 마크로 대체는 특정 식별자를 이것에 연관된 문자 시퀀스로 간단히 대체 오류 메시지를 정의 컴파일러는 식별자 E_MS를 만날 때 문자열 "standard error on input\n"으로 실제로 대치 만일 식별자가 인용 부호 있는 문자열 내에 존재한다면 어떠한 대체도 일어나지 않음 다음은 this is a test가 아니라 XYZ를 출력 #define E_MS "standard error on input\n" … printf(E_MS); #define XYZ this is a test … printf("XYZ"); 6
Ch13. 선행처리기와 주석문 13.2 #define #define 지시자 특정 문자가 한 라인을 초과하면, 라인의 끝에 백슬래쉬(\)를 사용하여 다음 라인으로 계속 식별자를 정의하기 위해서 대문자 사용 #define의 위치는 프로그램에 분산하는 것보다 파일의 시작 부분 또는 헤더 파일에 넣는다 선행처리기는 상수의 잦은 변화에도 유연하게 대처 프로그램 개발과 유지 보수에 용이 #define LONG_STRING "this is a very long \ string that is used as an example" #define MAX_SIZE 100 /* ... */ float balance[MAX_SIZE]; /* ... */ for(i=0; i<MAX_SIZE; i++) printf("%f", balance[i]); 7
13.2 #define 따라하기1 Ch13. 선행처리기와 주석문 #include <stdio.h> //printf() 의 이용을 위한 헤더 파일 포함 #define PHI 3.14 //PHI를 3.14로 대치하는 지시자 /*>>>>>>>>>>>>>>> main() 함수 시작 <<<<<<<<<<<<<<<<<<<<*/ void main(void) { double radius = 2; double circumference = 2 * PHI * radius; printf("반지름이 %lf 인 원의 둘레는 %lf 입니다.\n", radius, circumference); } 8
13.2 #define 함수와 유사한 마크로 정의 마크로 이름이 인자를 가질 수 있음 Ch13. 선행처리기와 주석문 13.2 #define 함수와 유사한 마크로 정의 마크로 이름이 인자를 가질 수 있음 마크로 이름을 만날 때마다, 이것의 정의에서 사용된 인자들은 프로그램의 실 인자(Actual argument)로 대치 마크로의 이러한 형식을 함수와 유사한 마크로(function-like macro)라고 한다 프로그램이 컴파일 될 때, 마크로 정의 a는 -1 값과 1 값으로 대치 #include <stdio.h> #define ABS(a) (a)<0 ? -(a) : (a) void main(void) { printf("abs of -1 and 1: %d %d", ABS(-1), ABS(1)); } 9
13.2 #define 따라하기2 Ch13. 선행처리기와 주석문 #include <stdio.h> //printf() 의 이용을 위한 헤더 파일 포함 #define SQUARE(x) ((x) * (x)) /*>>>>>>>>>>>>>>> main() 함수 시작 <<<<<<<<<<<<<<<<<<<<*/ int main(void) { printf("2 * 2 = %d, 3 * 3 = %d\n", SQUARE(2), SQUARE(3)); return 0; } 10
13.3 #include include 지시자 컴파일러에게 또 다른 소스 파일을 읽도록 명령 Ch13. 선행처리기와 주석문 13.3 #include include 지시자 컴파일러에게 또 다른 소스 파일을 읽도록 명령 추가 소스 파일의 이름은 인용부호 또는 각진 괄호들(angle bracket) 사이에 포함 표준 헤더 파일(시스템 정의 파일)을 포함하는데 각진 괄호를 사용 인용 부호는 일반적으로 특정 프로그램과 특별히 연관된 파일(사용자 정의 파일을 검색)들을 포함하는데 사용 #include <stdio.h> /* 시스템 정의 파일명 */ #include “test.txt“ /* 사용자 정의 파일명 */ 11
Ch13. 선행처리기와 주석문 실습 과제 <1>따라하기1 ~ 따라하기2 실습 12
Q&A 13