Macro #define

Tony ViTony Vi
3 min read

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 hay MAX_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ẫu do { ... } while(0) giúp tránh lỗi khi dùng trong if.


📌 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ó đọclỗ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ạngTừ khóa / Ký hiệuVí 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òngdo { ... } while(0) với dấu \
Điều kiện tiền xử lý#if, #ifdef,...#ifdef DEBUG ... #endif
Gỡ macro#undef#undef PI

0
Subscribe to my newsletter

Read articles from Tony Vi directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Tony Vi
Tony Vi