Step-by-Step
[C] 매크로 #define 본문
전처리기
# 키워드는 컴파일러가 컴파일을 실행하기 전에 처리한다고 하여, 전처리기(Preprocessor) 또는 매크로(Macro)라고 한다. 예를 들어, 전처리기를 이용하여 다른 헤더 파일을 include 하면 ex) #include <stdio.h> 등 하위 코드에서 scanf나 printf와 같은 함수들을 사용할 수 있다.
매크로
- 매크로는 컴파일러에게 코드의 특성을 알려주는 키워드
- 특정 키워드를 코드로 치환하는 것 (상수 정의, 인라이닝, 문법 정의/변형 등)
- 정해진 순서에 따라 어떻게 특정한 입력 시퀀스가 출력 시퀀스로 매핑되어야 하는지 정의하는 규칙이나 패턴
- 컴파일 전에 해당 매크로에 #define에 정의된 함수, 값 등 형태가 대입되어짐
#define
- 특정 숫자, 함수, 프로그램 블록을 다른 형태로 변환 지정한다.
- 다양한 선언이 가능하며, 조건은 선언된 해당 줄에만 적용되고, 여러 줄을 연결하기 위해서는 '\'을 사용하여 한 줄처럼 코딩하면 된다.
- #define을 통해 매크로를 정의하고, #undef를 이용하여 매크로를 무효화 할 수 있다.
- #define 매크로 유형에는 대상 변환형이 있고, 유사 함수 변환형이 있다.
대상 변환형
#define PI 3.141592
...
int r = 5;
double area = r * r * PI;
유사 함수 변환형
#define ADD(X, Y) ((X)+(Y))
...
int sum = ADD(3,4);
문자열 대체 ##
#define DECLARE_STRUCT_TYPE(name) typedef struct name##_s name##_t
DECLARE_STRUCT_TYPE(g_object); // 출력 결과는 typedef struct g_object_s g_object_t;
주의사항 - 텍스트 치환
매크로, 특히 인자를 받는 함수 형태는 타입 검사나 연산작용을 적용하지 않고 바로 인자를 치환합니다.
예를들어,
#define MUL(X) X*X
int mul = MUL(5);
해당 값은 5 * 5 = 25가 나오게 됩니다.
하지만 만약 2+3 이런식으로 집어넣게 된다면,
#define MUL(X) X*X
int mul = MUL(2+3);
해당 값은 2+3*2+3 = 11 이 나오게 됩니다.
이런 문제를 해결하기 위해서는, 혹시나 연산 값이 들어갈 상황을 방지하기 위해 괄호를 사용해야 합니다.
#define MUL(X) (X)*(X)
int mul = MUL(2+3);
이런식으로 사용하게 된다면, 값은 (2+3)*(2+3) = 25가 나오게 됩니다.
'임베디드 > Embedded C' 카테고리의 다른 글
[Embedded] DMA (0) | 2024.09.26 |
---|---|
[Embedded] UART (0) | 2024.09.24 |
[Embedded] 구조체 멤버 메모리 할당 #Pragma (0) | 2024.09.06 |
Comments