본문 바로가기

C

26장 . 전처리기에 의한 매크로 처리

[전처리기에 의한 매크로 처리]

[전처리기에 의한 전처리]

  • 프로그램 작성 -> 컴파일 -> 링크 -> 실행파일 생성
  • 프로그램 작성 -> 전처리 -> 컴파일 -> 링크 -> 실행파일 생성

[#define으로 시작하는 전처리기 지시자]

컴파일러에 의해 처리되는 것이 아니다

전처리기에게 단순 치환 작업을 요청할 때 사용되는 지시자 .

#define PI 3.1415

[매크로를 이용한 함수의 구현]

[메크로 함수란]

매크로를 기반으로 정의되는 함수 (함수가 아니라 매크로 . 단지 함수의 특성을 지닐 뿐)

#define SQUARE1(x) x*x
#define SQUARE2(x,y,z) (x+y+z)

int main(void)
{
	SQUARE1(3);
}
  • 장점 : 자료형에 독립적이며 , 실행 속도가 향상된다 (코드 에어리어 안 거치기에)
  • 단점 : 구현과 디버깅이 어렵다
  • 조건 : 함수의 크기가 작아야함 (실행 파일의 크기가 커질 수 있다)

[#을 이용한 전달 인자의 문자열화]

#include<stdio.h>

#define ADD(x, y) printf("x+y=%d \n",x+y)
int main(void)
{
	ADD(3, 4);
	return 0;
}

해당 예제는 x+y 문자열이 값에 따라 바뀌지 않는다는 문제가 있다.

이를 해결하기 위해 사용할 특성은

  • "asd" "def" 가 있다면 "abcdef"로 합쳐진다
  • #x를 한다면 문자열로 바꾸어 준다 ex)#x = "x"
#include<stdio.h>
#define ADD(x,y) printf( #x "+" #y "=%d \n", x+y)

int main (void)
{
	ADD(3, 4);
	//printf("3" "+" "4" "=%d \n", 3 + 4);
	//printf("3 + 4 =%d\n", 3 + 4);
	return 0;
}

[##을 이용한 토큰의 결합]

#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]));

	//printf("%d \n", 24);
	//printf("%s \n", "GOODMORNING");
	//printf("%d %d \n", arr[0], arr[1]);

	return 0;

프로그램이 이해하는 최소단위의 결합