고흐의 연구실/C언어와 C++
[C언어] 매크로 #define #undef
전고흐
2020. 10. 11. 22:34
728x90
#define 지시자는 값을 다른 이름으로 정의하며 이름을 짓는 방법은 변수와 같습니다. 보통 매크로는 대문자를 사용합니다.
- #define 매크로이름 값
define 은 변수명을 지정하듯 사용해도 된다고 생각하면 될 듯합니다.
#define으로 정의한 매크로는 다른 이름으로 다시 정의할 수 있습니다.
#define ARRAY_SIZE 10 // 10을 ARRAY_SIZE로 정의
#define DEFAULT_ARRAY_SIZE ARRAY_SIZE // ARRAY_SIZE를 DEFAULT_ARRAY_SIZE로 정의
#define으로 정의한 매크로를 해제하고 싶을 때는 #undef를 사용합니다.
- #undef 매크로이름
#define은 함수 모양의 매크로도 정의할 수 있습니다.
- #define 매크로이름(x) 함수(x)
- #define 매크로이름(x) 코드조합
example)
#include <stdio.h>
#define PRINT_NUM(x) printf("%d\n", x) // printf("%d\n", x)를 PRINT_NUM(x)로 정의
int main()
{
PRINT_NUM(10); // 10: printf("%d\n", 10)
PRINT_NUM(20); // 20: printf("%d\n", 20)
return 0;
}
#define은 줄바꿈이 일어날 때 \를 사용하여 여러 줄을 매크로로 만들 수 있습니다.
example) SWAP 매크로
#include <stdio.h>
// 매크로 안에서 변수를 선언할 수 있도록 do while 사용
// a와 b의 값을 서로 바꿈
#define SWAP(a, b, type) do { \
type temp; \
temp = a; \
a = b; \
b = temp; \
} while (0)
int main()
{
int num1 = 10;
int num2 = 20;
SWAP(num1, num2, int); // 값을 바꿀 자료형으로 int를 지정
printf("%d %d\n", num1, num2); // 20 10: 두 변수의 값이 바뀜
float num3 = 1.5f;
float num4 = 3.8f;
SWAP(num3, num4, float); // 값을 바꿀 자료형으로 float를 지정
printf("%f %f\n", num3, num4); // 3.800000 1.500000: 두 변수의 값이 바뀜
return 0;
}
do while (0)은 { } (중괄호)로 묶여 있기 때문에 안에서 변수를 마음대로 선언할 수 있고, 선언된 변수는 do while (0)을 벗어나면 변수가 사라집니다. 즉, SWAP 매크로를 계속 사용했을 때 같은 이름으로 된 변수가 여러 개 생기지만 컴파일 에러를 방지할 수 있습니다.
#define 연산자 우선순위
// a와 b, 결과를 모두 괄호로 묶어줌
#define MUL(a, b) ((a) * (b))
// a와 b, 결과를 모두 괄호로 묶어줌
#define ADD(a, b) ((a) + (b))
#define 연결
#define에서 ##을 사용하면 여러 코드(값)를 붙일 수 있습니다.
- #define 매크로이름(a, b) a##b
example1)
#include <stdio.h>
// a와 b를 붙이는 CONCAT 매크로 정의
#define CONCAT(a, b) a##b
int main()
{
printf("%d\n", CONCAT(1, 2)); // 12
return 0;
}
>> 결과 : 12
example2)
#include <stdio.h>
// hello와 x를 붙여서 호출하는 EXECUTER 매크로 정의
#define EXECUTER(x) hello##x()
void hello1()
{
printf("hello 1\n");
}
void hello2()
{
printf("hello 2\n");
}
int main()
{
EXECUTER(1); // hello1 함수 호출
EXECUTER(2); // hello2 함수 호출
return 0;
}
>> 결과 : hello 1
hello 2
728x90