Macro #define

Trong ngôn ngữ C (và C++), lệnh #define
là một chỉ thị tiền xử lý (preprocessor directive) dùng để định nghĩa macro — đoạn mã sẽ được thay thế trực tiếp trước khi biên dịch.
Dưới đây là danh sách đầy đủ các dạng sử dụng #define
trong C, kèm ví dụ minh họa rõ ràng và cụ thể:
📌 1. Macro hằng số (Constant Macro)
#define PI 3.14159
#define MAX_SIZE 100
Bất kỳ chỗ nào có
PI
hayMAX_SIZE
trong mã, trình tiền xử lý sẽ thay bằng giá trị tương ứng.
📌 2. Macro hàm (Function-like Macro)
#define SQUARE(x) ((x) * (x))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
Cẩn thận dấu ngoặc
()
để tránh lỗi khi thay thế biểu thức.
📍 Lưu ý: Không có kiểm tra kiểu (type safety) như hàm thật.
📌 3. Macro nối chuỗi (Token Pasting) – ##
#define CONCAT(a, b) a##b
Ví dụ:
int CONCAT(my, var) = 10; // tạo thành: int myvar = 10;
📌 4. Macro chuỗi hóa (Stringizing) – #
#define TO_STRING(x) #x
Ví dụ:
printf("%s\n", TO_STRING(Hello World)); // In: Hello World
📌 5. Macro nhiều dòng (Multiline Macro)
#define DEBUG_PRINT(msg) do { \
printf("DEBUG: %s\n", msg); \
} while(0)
Sử dụng
\
để xuống dòng mà vẫn thuộc macro. Mẫudo { ... } while(0)
giúp tránh lỗi khi dùng trongif
.
📌 6. Macro có điều kiện (dùng cùng với #ifdef
, #ifndef
, #if
, #else
, #endif
)
#define DEBUG
#ifdef DEBUG
#define LOG(msg) printf("DEBUG: %s\n", msg)
#else
#define LOG(msg)
#endif
Cho phép bật/tắt code theo điều kiện biên dịch.
📌 7. Undefining macro – #undef
#undef PI
#define PI 3.14
Xóa định nghĩa macro trước khi định nghĩa lại hoặc để tránh xung đột.
📌 8. Macro tự sinh tên biến (biến tạm thời)
#define TEMP_NAME(prefix) prefix##__LINE__
Ví dụ:
int TEMP_NAME(temp) = 5; // int temp42 = 5; (nếu dòng số 42)
🧠 Gợi ý nâng cao
Có thể dùng macro để tạo logging, inline asserts, min/max, hoặc giao diện giả lập OOP.
Tuy nhiên, macro rất dễ gây khó debug, khó đọc và lỗi tiềm ẩn — nên ưu tiên
inline functions
,const
,enum
trong C++ nếu có thể.
✅ Tổng kết: Danh sách dạng macro
Dạng | Từ khóa / Ký hiệu | Ví dụ |
Hằng số | #define | #define PI 3.14 |
Macro hàm | #define + tham số | #define SQUARE(x) ((x)*(x)) |
Nối chuỗi | ## | #define CONCAT(a,b) a##b |
Chuỗi hóa | # | #define STR(x) #x |
Macro nhiều dòng | \ xuống dòng | do { ... } while(0) với dấu \ |
Điều kiện tiền xử lý | #if , #ifdef ,... | #ifdef DEBUG ... #endif |
Gỡ macro | #undef | #undef PI |
Subscribe to my newsletter
Read articles from Tony Vi directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
