Step-by-Step

[C] 매크로 #define 본문

임베디드/Embedded C

[C] 매크로 #define

희주(KHJ) 2024. 9. 24. 10:20

전처리기

# 키워드는 컴파일러가 컴파일을 실행하기 전에 처리한다고 하여, 전처리기(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