Download presentation
Presentation is loading. Please wait.
1
제 4장 전처리기와 매크로 Hello!! C 언어 강성호 김학배 최우영
2
순서 전처리기 #include문과 #define문 매크로 매크로와 헤더 파일 typedef문과 enum문 조건부 컴파일
제 4장 전처리기와 매크로 전처리기 #include문과 #define문 매크로 매크로와 헤더 파일 typedef문과 enum문 조건부 컴파일 이미 정의된 매크로 상수 기타 전처리문 매크로와 typedef를 이용한 예제 : 주사위놀이 요약
3
전처리기 전처리기(preprocessor)는 말 그대로 우선 처리되어야 하는 부분을 먼저 처리한다는 것
제 4장 전처리기와 매크로 전처리기(preprocessor)는 말 그대로 우선 처리되어야 하는 부분을 먼저 처리한다는 것 원시 코드를 컴파일러에 넘기기 전에 우선 전처리기가 소스 코드를 읽고 전처리기에 해당하는 명령을 먼저 모두 수행하여 새로운 소스 코드를 만드는 것을 의미 전처리기가 주로 수행하는 내용은 변수의 문자열로의 치환, 파일의 포함, 매크로(macro) 함수의 사용, 분할 컴파일 등으로 요약됨 전처리기에서 사용되는 지시어는 모두 앞에 # 기호를 사용
4
전처리기(계속) ANSI C에서 사용되는 전처리문 파일포함 : #include 문자열 또는 매크로 정의 : #define
제 4장 전처리기와 매크로 ANSI C에서 사용되는 전처리문 파일포함 : #include 문자열 또는 매크로 정의 : #define 매크로 해제 : #undef 조건부 컴파일 : #if #elif #else #ifdef #ifndef #endif 행번호 제어 : #line 컴파일 제어 : #error #pragma
5
#include문과 #define문 #include 문 #include 문의 사용 형식
제 4장 전처리기와 매크로 #include 문 #include 문의 사용 형식 #include <파일 이름> #include "파일 이름" #include 문에 의해 포함되는 대부분의 파일은 확장자가 ".h"인 헤더(header) 파일 헤더 파일들의 내용은 #define 문을 사용한 문자상수나 매크로 함수, 그리고 C에서 기본으로 제공하는 표준 함수들의 함수 원형(prototype) " " 표시를 사용하여 파일을 포함하는 경우는 현재 작업 중인 디렉토리에서 입력된 파일 이름을 찾게되고 < > 표시를 사용하는 경우에는 이미 설정되어 있는 include 디렉토리에서 해당 파일 이름을 찾아 포함
6
#include문과 #define문 #define 문 [예제 4-3]
제 4장 전처리기와 매크로 #define 문 [예제 4-3] #define MAX2INT /* 최대 2바이트 정수값 */ #define MAX4INT /* 최대 4바이트 정수값 */ #define EOF (-1) /* 파일 끝, End Of File */ #define EQ == /* 논리연산자 ==의 대체 */ #define NOTEQ != /* 논리연산자 !=의 대체 */ [예제 4-4] #include <stdio.h> #define STRING "This is an example string used in chapter 2.” void main(void) { printf(STRING); printf("\n"); } [실행 결과] This is an example string used in chapter 2.
7
매크로 식별자와 ( ) 사이는 공간을 두지 말고 붙여 써야 함 매크로 함수는 #define 문을 사용하여 함수를 구성함
제 4장 전처리기와 매크로 식별자와 ( ) 사이는 공간을 두지 말고 붙여 써야 함 매크로 함수는 #define 문을 사용하여 함수를 구성함 [예제 4-5] #include <stdio.h> #define ODD(a) (a%2 == 0) ? 0 : 1 void main(void) { if(ODD(4)) printf("It is odd.\n"); else printf("It is even.\n"); } [실행결과] It is even.
8
매크로 [예제 4-6] #include <stdio.h>
제 4장 전처리기와 매크로 [예제 4-6] #include <stdio.h> #define ODD(a) ((a)%2 == 0) ? 0 : 1 void main(void) { if(ODD(4)) printf(”It is odd.\n"); else printf(”It is even.\n"); } [실행결과] It is even. 하나의 매크로 함수는 다른 매크로 함수를 만들기 위하여 사용 가능 [예제 4-7] #define MAX(x, y) (((x) > (y)) ? (x) : (y) #define MAX4(a,b,c,d) MAX(MAX(a,b), MAX(c,d)) # 연산자는 매크로의 정의에서 인자를 사용하여 문자열을 만드는데 유용하게 사용
9
매크로 [예제 4-9] #include <stdio.h>
제 4장 전처리기와 매크로 [예제 4-9] #include <stdio.h> #define hi_msg(a, b) printf("Hi, " #a " and " #b ", Have a nice day.\n") int main(void){ hi_msg(Eunkyo, Jiho); return 0; } [실행결과] Hi, Eunkyo and Jiho, Have a nice day. /* stdio.h 파일이 이 위치에 포함된다. */ int main(void) { printf("Hi, " "Inpyo" " and " "Jiho" ", Have a nice day.\n");
10
매크로 제 4장 전처리기와 매크로 공백으로 분리된 문자 상수는 연결됨 printf("Hi, Inpyo and Jiho, Have a nice day.\n"); 전처리기 연산자 ##는 변수 표현 방식을 자유롭게 하기 위해 사용되는데 두 개의 문자를 합치는 기능
11
매크로 [예제 4-10] #include <stdio.h> #define X(i) ## i
제 4장 전처리기와 매크로 [예제 4-10] #include <stdio.h> #define X(i) ## i int main(void) { int x1=1, x2=2, x3=3; printf("x1=%d, x2=%d, x3=%d \n", x1, x2, x3); printf("x1=%d, x2=%d, x3=%d \n", X(1), X(2), X(3)); return 0; } [실행결과] x1=1, x2=2, x3=3
12
매크로와 헤더 파일 매크로 함수의 예 [예제 4-11] #define getchar() getc(stdin)
제 4장 전처리기와 매크로 매크로 함수의 예 [예제 4-11] #define getchar() getc(stdin) #define putchar(x) putc((x), stdout) 표준 라이브러리에서 제공하는 매크로를 사용하기 위해서는 해당 헤더 파일을 #include 문을 사용하여 포함해야 함 많이 사용하는 매크로 함수나 문자 상수를 별도의 헤더 파일에 저장하여 사용하는 것이 편리한 경우가 많음 헤더 파일에는 함수의 원형도 선언하고 구조체도 선언할 수 있으므로 자신이 하고자 하는 프로그램에 맞게 헤더 파일을 구성하여 사용하면 보다 효과적인 프로그램이 수행 가능
13
매크로와 헤더 파일 [예제 4-12] #include <stdio.h> #include <ctype.h>
제 4장 전처리기와 매크로 [예제 4-12] #include <stdio.h> #include <ctype.h> #define EOS '\0’ #define EQ == #define NOTEQ != #define ISPSIGN(x) ((x) EQ '+') ? 1 : 0 #define ISMSIGN(x) ((x) EQ '-') ? 1 : 0
14
매크로와 헤더 파일 [예제 4-13] [실행결과] Result = -2 #include "myheader.h”
제 4장 전처리기와 매크로 [예제 4-13] [실행결과] Result = -2 #include "myheader.h” void main(void) { int result; result = function(" "); printf("Result = %d \n", result); } int function(char s[]) { int i, num ; int result = 0, sign = 1; for (i=0; s[i] != EOS; i++) { if (isdigit(s[i])) { num = ((s[i] - '0' + 1) < 9) ? s[i] - '0' + 1 : 0 ; result += sign * num ; } else if (IS_PLUS_SIGN(s[i])) sign=-1 ; else if (IS_MINUS_SIGN(s[i])) sign=1; } return result ; }
15
Typedef문과 enum문 typedef 문
제 4장 전처리기와 매크로 typedef 문 데이터형을 사용자가 알아보기 쉽게 하기 위해 다른 식별자를 사용할 수 있도록 하는 기능 typedef 문의 선언 형식 typedef 데이터형 식별자1, 식별자2, …… ; [예제 4-14] typedef unsigned char byte; typedef int array[100]; typedef int *INT_PTR; byte c; /* unsigned char c와 같음 */ array i; /* int i[100]과 같음 */ INT_PTR x; /* int *x와 같음 */
16
Typedef문과 enum문 제 4장 전처리기와 매크로 typedef 문을 사용한 캐스트 연산자의 정의
17
Typedef문과 enum문 제 4장 전처리기와 매크로 enum 문 enum 문은 열거형 상수의 데이터형을 정의하여 선언할 수 있도록 하기 위해서 데이터형을 정의하기 위해 사용 열거형 상수의 의미 enum 문의 선언 형식
18
Typedef문과 enum문 enum 문 [예제 4-15] #include <stdio.h>
제 4장 전처리기와 매크로 enum 문 [예제 4-15] #include <stdio.h> int main(void) { enum {one,two,three,four,five} sum, multi ; sum = one + two + three + four + five ; multi = one * two * three * four * five ; printf("Result of summation : %d \n", sum) ; printf("Result of multiplication : %d. \n", multi); return 0; } [실행결과] Result of summation : 10 Result of multiplication : 0
19
Typedef문과 enum문 [예제 4-16] #include <stdio.h> int main(void) {
제 4장 전처리기와 매크로 [예제 4-16] #include <stdio.h> int main(void) { enum { one=1, two, three, four, five} sum, multi ; sum = one + two + three + four + five ; multi = one * two * three * four * five ; printf("Result of summation : %d \n", sum) ; printf("Result of multiplication : %d. \n", multi); return 0; } [실행결과] Result of summation : 15 Result of multiplication : 120 [예제 4-17] enum {apple = 3, pear , lemon, banana = 8, pineapple = 8} fruits ;
20
Typedef문과 enum문 제 4장 전처리기와 매크로 C 컴파일러는 enum 문의 열거형 상수를 선언된 함수 안에서만 인식할 수 있으므로 다른 함수에서는 같은 열거형 함수를 사용할 수 없음 [예제 4-18] int main(void) { enum arith sum ;/* sum의 데이터형을 열거형 상수로 선언 */ sum = one+two+three+four+five ; printf("Result of summation : %d \n", sum) ; printf("Result of Multiplication : %d. \n", multiply() ); return 0; } enum arith multiply( void ){ enum arith multi; /* 열거형 상수로 선언 */ multi = one * two * three * four * five ; return multi ;
21
Typedef문과 enum문 제 4장 전처리기와 매크로 typedef 문을 이용한 enum 문의 선언
22
Typedef문과 enum문 [예제 4-19] #include <stdio.h>
제 4장 전처리기와 매크로 [예제 4-19] #include <stdio.h> typedef enum { one=1,two,three,four,five } arith ; arith multiply(void); /* multiply의 데이터형을 열거형상수로 선언 */ int main(void){ arith sum ; /* sum의 데이터형을 열거형 상수로 선언 */ sum = one + two + three + four + five ; printf("Result of summation : %d \n", sum) ; printf("Result of Multiplication : %d. \n", multiply() ); return 0; } arith multiply( void ) { arith multi ; /* 변수 multi를 열거형 상수로 선언 */ multi = one * two * three * four * five ; return multi ;
23
조건부 컴파일 제 4장 전처리기와 매크로 조건부컴파일(conditionalcompilation)은 프로그램 개발 과정에서 사용되거나 프로그램의 이식성을 높여 서로 다른 형태의 컴퓨터에서도 동작할 수 있도록 하기 위해서 사용 조건부 컴파일에 사용되는 지시어 사용법 #if 문의 사용 형식 #ifdef 문의 사용 형식
24
조건부 컴파일 제 4장 전처리기와 매크로 조건부 컴파일에 사용되는 지시어 사용법 #ifndef 문의 사용 형식
25
조건부 컴파일 #if 문의 사용 형식에서 전처리기에 문자상수는 sizeof나 캐스트 연산자를 사용할 수 없음
제 4장 전처리기와 매크로 #if 문의 사용 형식에서 전처리기에 문자상수는 sizeof나 캐스트 연산자를 사용할 수 없음 defined 지시어 Defined 문자열 또는 defined(문자열) #if defined(문자열) [예제 4-20] #define DEBUG 1 #if DEBUG /* 디버깅을 위한 프로그램 루틴 */ #endif #define DEBUG #ifdef DEBUG /* 디버깅을 위한 함수들을 선언 */ #endif /* 프로그램 옵션으로 디버깅을 하려면 DEBUG를 1로 아니면 0으로 */ #if DEBUG /* 디버깅을 위한 루틴 */
26
조건부 컴파일 [예제] #ifdef 문자열1 ① /* 문자열1이 정의되어 있으면 ① 컴파일 */ #elif 문자열2
제 4장 전처리기와 매크로 [예제] #ifdef 문자열1 ① /* 문자열1이 정의되어 있으면 ① 컴파일 */ #elif 문자열2 ② /* 문자열1이 정의되어 있지 않고 문자열 2가 정의되어 있으면 ② 컴파일 */ #elif 문자열3 ③ /* 문자열1과 문자열2 모두 정의 되지 않고 문자열 3이 정의되어 있으면 ③ 컴파일 */ #else ④ /* 문자열1, 문자열2, 문자열3 모두 정의되어 있지 않으면 ④ 컴파일 */ #endif
27
조건부 컴파일 [예제 4-22] #if defined(__STDC__) || defined(SUN)
제 4장 전처리기와 매크로 [예제 4-22] #if defined(__STDC__) || defined(SUN) #include <string.h> #else #include <strings.h>
28
이미 정의된 매크로 상수 이미 정의된 매크로는 앞뒤에 각각 두 개씩의 밑줄을 사용 ANSI C에서 미리 정의된 매크로 상수
제 4장 전처리기와 매크로 이미 정의된 매크로는 앞뒤에 각각 두 개씩의 밑줄을 사용 ANSI C에서 미리 정의된 매크로 상수
29
기타 전처리문 #error #error 문의 사용법 #error 오류메세지 오류메세지는 " "를 사용하지 않아도 됨
제 4장 전처리기와 매크로 #error #error 문의 사용법 #error 오류메세지 오류메세지는 " "를 사용하지 않아도 됨 전처리기는 #error 문을 만나면 즉시 컴파일을 중단하고 현재 컴파일하고 있던 파일 이름, #error 문이 사용된 행번호, 그리고 #error 문과 오류메세지를 화면에 출력 출력 형식 파일 이름 : 줄 수 : #error 오류메시지
30
기타 전처리문 제 4장 전처리기와 매크로 #progma #progma 전처리기 지시어는 컴파일 경고 메시지와 관련된 컴파일 옵션을 원시 코드에서 제어할 수 있도록 함 컴파일을 하게 되면 여러 종류의 경고 메시지를 볼 수 있는데 이들이 표시되거나 표시되지 않도록 제어할 수 있음 #line #line 문은 앞 절에서 배운 이니 정의된 매크로 상수 __LINE__과 __FILE__를 변경하고자 할 경우에 사용 사용형식 #line 정수 "파일 이름" 정수는 원하는 행번호로 변경하기 위해서 사용하는 것으로 #line 문이 쓰인 다음 줄부터 입력된 행번호로 변경 파일이름은 생략 가능
31
기타 전처리문 #line [예제 4-23] #include <stdio.h> void main(void) {
제 4장 전처리기와 매크로 #line [예제 4-23] #include <stdio.h> void main(void) { printf("line number : %d, file name : %s \n", __LINE__, __FILE__); #line 100 "main.c" printf("line number : %d, file name : %s \n", __LINE__, __FILE__); } [실행결과] line number : 4, file name : 4-23.c line number : 101, file name : main.c
32
기타 전처리문 #undef #undef는 이미 전에 정의된 매크로 함수나 문자 상수의 정의를 해제하기 위해서 사용
제 4장 전처리기와 매크로 #undef #undef는 이미 전에 정의된 매크로 함수나 문자 상수의 정의를 해제하기 위해서 사용 사용 방법은 #define 문에 의해 정의된 식별자를 #undef 뒤에 넣어주면 됨
33
매크로와 typedef를 이용한 예제 주사위놀이 규칙 컴퓨터와 사람이 주사위를 던져 많은 수의 값이 나온 사람이 이기는 게임
제 4장 전처리기와 매크로 주사위놀이 규칙 컴퓨터와 사람이 주사위를 던져 많은 수의 값이 나온 사람이 이기는 게임 주사위는 사면체로 1에서 4까지의 숫자를 가짐
Similar presentations