null
vuild_
Nodes
Flows
Hubs
Login
MENU
Notifications
Login
☆ Star
#define과 매크로 (Define & Macro)
#c
#c-lang
#intermediate
#preprocessor
#define
@devpc
|
2026-03-29 12:57:39
|
GET /api/v1/nodes/55?nv=2
History:
v2 (2026-03-29) (Latest)
v1 (2026-03-29)
0
Views
5
Calls
# #define과 매크로 (Define & Macro) ## 전처리기(Preprocessor)란? 컴파일 전에 소스 코드를 텍스트 수준에서 변환하는 단계입니다. `#`으로 시작하는 지시문을 처리합니다. ``` 소스 코드 → [전처리기] → 전처리된 코드 → [컴파일러] → 목적 파일 ``` --- ## #define — 상수 정의 ```c #define PI 3.14159265 #define MAX_SIZE 100 #define APP_NAME "MyApp" ``` - **컴파일 전** 텍스트 치환이 이루어집니다. - 타입이 없고 세미콜론(`;`)을 붙이지 않습니다. ```c #define MAX_SIZE 100 int arr[MAX_SIZE]; // int arr[100];으로 치환됨 printf("size: %d\n", MAX_SIZE); // printf("size: %d\n", 100); ``` ### const vs #define | 구분 | `#define` | `const` | |------|-----------|---------| | 타입 | ❌ 없음 | ✅ 있음 | | 디버거 | ❌ 이름 안 보임 | ✅ 보임 | | 범위 | 파일 전체 | 블록 범위 | | 권장 | 조건부 컴파일, 매크로 | 일반 상수 | ```c // 권장 const int MAX_SIZE = 100; // 타입 안전, 디버거 지원 #define MAX_SIZE 100 // 전처리기 치환, 타입 없음 ``` --- ## #define — 함수형 매크로 인자를 받는 매크로로 간단한 연산을 인라인으로 처리합니다. ```c #define SQUARE(x) ((x) * (x)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define ABS(x) ((x) < 0 ? -(x) : (x)) ``` ```c int a = 5; printf("%d\n", SQUARE(a)); // 25 printf("%d\n", MAX(3, 7)); // 7 printf("%d\n", ABS(-10)); // 10 ``` > **주의:** 모든 인자와 전체 표현식을 **괄호로 감싸야** 합니다. --- ## 부작용(Side Effect) 주의 ### 잘못된 매크로 — 괄호 누락 ```c #define SQUARE(x) x * x // ❌ 괄호 없음 int result = SQUARE(1 + 2); // 치환: 1 + 2 * 1 + 2 = 5 (기대: 9) ``` ```c #define SQUARE(x) ((x) * (x)) // ✅ 올바른 정의 int result = SQUARE(1 + 2); // 치환: ((1 + 2) * (1 + 2)) = 9 ``` ### 증감 연산자와 함께 — 이중 평가 문제 ```c #define MAX(a, b) ((a) > (b) ? (a) : (b)) int x = 5; int y = MAX(x++, 3); // 치환: ((x++) > (3) ? (x++) : (3)) // x가 두 번 증가할 수 있음 → 정의되지 않은 동작 ``` > 함수형 매크로 인자에 **부작용이 있는 표현식**(++, --)을 사용하지 마세요. > 이 경우 `inline` 함수를 사용하는 것이 안전합니다. --- ## 안전한 대안 — inline 함수 (C99) ```c static inline int max(int a, int b) { return a > b ? a : b; } static inline int square(int x) { return x * x; } ``` - 타입 안전 - 이중 평가 없음 - 디버깅 가능 --- ## 유용한 매크로 패턴 ### 배열 크기 ```c #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) int data[] = {1, 2, 3, 4, 5}; printf("%zu\n", ARRAY_SIZE(data)); // 5 ``` ### 디버그 출력 ```c #define DEBUG_PRINT(fmt, ...) \ fprintf(stderr, "[DEBUG] %s:%d: " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__) DEBUG_PRINT("x = %d", x); // [DEBUG] main.c:42: x = 10 ``` ### 사용하지 않는 변수 경고 억제 ```c #define UNUSED(x) ((void)(x)) void func(int a, int b) { UNUSED(b); // 경고 없이 무시 return a * 2; } ``` --- ## 정리 | 종류 | 예시 | 용도 | |------|------|------| | 상수 매크로 | `#define PI 3.14` | 전역 상수 | | 함수형 매크로 | `#define MAX(a,b) ...` | 인라인 연산 | | 배열 크기 | `#define ARRAY_SIZE(a) ...` | 배열 길이 계산 | | 디버그 출력 | `#define DBG(...)` | 조건부 디버깅 | ---
// COMMENTS
ON THIS PAGE