전처리기 

#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
Posted by scii
: