매크로와 전처리기preprocessor

실행 파일의 생성 순서
프로그램 작성 >> 전처리Preprocess >>컴파일Compile
>> 링크Link >>실행파일 생성

#define을 시작하는 전처리기 지시자
Preprocessor Directive

매크로 상수--------------------
#define PI
3.1415 //전처리기는 PI를 3.1415로 치환하라...
---
#define - 전처리기지시자
PI -
매크로
3.1415 - 대체리스트

매크로 함수------------------
#include
<stdio.h>

#define SQUARE(x) x*x
int square(int x);

int
main(void)
{
    int a;

    printf("Input a number(int) :
");
    scanf("%d", &a);

    //(a+3)*(a+3) 계산 결과 출력
   
printf("Squareof %d : %d \n", a, SQUARE(a+3));
    printf("Squareof
%d : %d \n", a, square(a+3));

    return 0;
}

int
square(int x)
{
    return x*x;
}

실행결과
Input a
number(int) : 3
Square of 3: 15
Square of 3: 36
--------------
2
번째 결과가 이상하게 나온다. 매크로로 설정된 SQUARE(a+3)부분
이것은...square로 전해질 때는 (a+3)이
먼저 계산이 되어서 6이 전해졌지만...
SQUARE 매크로에서는 a+3*a+3 형태로 전해졌기 때문이다. 따라서 3+9+3
= 15가 출력된 것이다.

------------#을 통한 매크로 전달 인자의 문자열화 606p

//
char *str ="Helloworld" == char *str="Hello" "world" 이기때문에 밑의 문법이 가능

#include
<stdio.h>

#define FUN1(x) x
#define FUN2(x) #x
//
#define ADD(x, y) printf("x+y=%d \n", x+y) //ERROR
#define ADD(x, y)
printf( #x "+" #y "=%d \n", x+y) //OK

int main()
{
   
printf("FUN1 : %d \n", FUN(1000));
    printf("FUN2 : %d \n",
FUN2(1234ABCE));
    ADD(3,4)

    return 0;
}

출력결과
FUN1:
1000
FUN2: 1234ABCD
3+4=7
------------------##을 이용한 토큰의 결합
int
val = a+ b;
위의 문장을최소의 단위로 나누면 int, val, =, a, + b, ;, 이렇게 7개의 토큰으로
구성되어 있다.
#include <stdio.h>
#define CONCAT(a, b) a ## b

int
main(void)
{
    int arr[2] = {100, 200};

    printf("%d
\n", CONCAT(2, 4));
    printf("%s \n", CONCAT("Good", "Morning?"));
   
printf("%d %d \n", CONCAT(arr,[0]), CONCAT(arr, [1]));

   
return 0;
}

-----------이미 정의되어 있는 표준 매크로
__FILE__   - 현재 소스
코드의 파일명을 나타내는 문자열 %s
__TIME__  - 컴파일 시각을 "시:분:초"의 형태로 나타내는 문자열  %s
__DATE__ 
- 컴파일날짜를 "년 월 일"의 형태로 나타내는 문자열 %s
__LINE__  - 현재 처리중인 소스파일의 행 번호를
나타내는 문자열 %d

printf("현재 라인 번호 : %d \n", __LINE__);
printf("파일
이름 : %s \n", __FILE__);