전처리기 (Pre-Processor)
Programming/C 2013. 2. 15. 01:47 |전처리기
#define으로 시작하는 전처리기 지시자(Preprocess or Directive)
: #문자로 시작하는 문장을 가리켜 '전처리기 지시자'라 한다. 이러한 문장은 컴파일러가 아니라
전처리기에게 적절한 처리를 요구할 때 사용된다. (단순 치환 작업을 요청할 때 사용되는 지시자)
ex) #define PI 3.1415
↓ ↓ ↓
전처리기 지시자 매크로 대체 리스트
이것은 전처리기 지시자로 인해 컴파일 하기 전 PI를 3.1415로 치환한다.
※PI는 상수처럼 사용되고 있다. 그래서 매크로 상수를 이용한 배열 선언을 할 수 있다.
ex) #define NUM 10
int arr[NUM];
매크로 함수
: 매크로를 이용하면 함수 같은 매크로를 만들 수 있다.
매크로는 매크로인데 함수의 기능을 하는 매크로란 뜻이다. 함수처럼 인자를 전달받을 수 있다.
장점: 1. 매크로 함수는 자료형에 독립적이다. int형이든 float형이든 다 받을 수 있다.
즉, 매크로 함수는 전처리기에 의한 단순 치환 방식으로 구현되므로, 전달 인자의 자료형을 명시할 필요가 없고,
또 어떠한 자료형 변수를 인자로 전달해도 잘 동작한다.
2. 실행 속도가 향상된다.
단!! 함수 호출 문장이 전부 매크로 함수 몸체 부분으로 완전히 치환되어 버리기 때문에 코드의 크기는 커질 수 밖에 없다.
따라서 모든 함수를 매크로로 정의하는 것은 좋지 않다. 더불어 매크로 함수를 정의하는 것이 일반 함수를 정의하는 것보다
어렵고, 오류 발생의 소지가 높다. (오류 발생의 소지가 왜 높냐면, 컴파일러가 하는 것이 아니고 전처리기가 하는 것인데
전처리기는 오류를 못잡는다.)
함수를 매크로로 정의해서 손해 없이 속도 향상의 이점을 얻을 수 있는 방법은?
: 함수의 크기가 작아야 한다.
#include<stdio.h>
#define PI 3.14159265355820
#define AREA(x) (x * x * PI)
int main(void)
{
double a;
fputs("원의 반지름을 입력하세요: ", stdout);
scanf("%lf", &a);
printf("원의 넓이는 = %lf \n", AREA(a));
return 0;
}
----------------------------------------------------------------------------------------------------------------
#include<stdio.h>
#define MAX(a,b) (((a)>(b)) ? (a) : (b))
int main(void)
{
int a,b;
fputs("두개의 정수 입력: ", stdout);
scanf("%d %d", &a, &b);
printf("큰 수: %d \n", MAX(a,b));
return 0;
}
----------------------------------------------------------------------------------------------------------------
이미 정의되어 있는 표준 매크로
: C언어에는 정의하지 않아도 기본적으로 정의되어 있는 매크로가 존재한다. 이를 가리켜 표준 매크로라 한다.
프로그래머의 편의를 위해 제공이 되는 것이다.
__FILE__ = 현재 소스 코드의 파일명을 나타내는 문자열.
__TIME__ = 컴파일 시각을 "시:분:초"의 형태로 나타내는 문자열.
__DATE__ = 컴파일 날짜를 "월 년 일"의 형태로 나타내는 문자열.
__LINE__ = 현재 처리중인 소스파일의 행 번호를 나타낸다.
'Programming > C' 카테고리의 다른 글
조건부 컴파일 (0) | 2013.02.15 |
---|---|
모듈화 프로그래밍 (Modular Programming) (0) | 2013.02.15 |
C언어에서의 Token (0) | 2013.02.15 |
메모리 관리와 동적 할당 (0) | 2013.02.15 |
파일 복사 프로그램 (0) | 2013.02.15 |