Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Đối số độ dài biến cho Macro trong C

Ta biết có thể dùng đối số độ dài biến cho hàm trong C (dùng ellipsis ...). Tương tự, macro cũng hỗ trợ đối số độ dài biến. Cũng dùng ellipsis, và __VA_ARGS__ dùng để xử lý các đối số biến. Toán tử nối ## dùng để nối các đối số biến.

Trong ví dụ này, Macro nhận đối số biến như printf() hoặc scanf(). Macro này in tên file, số dòng và thông báo lỗi. Tham số đầu tiên là pr để xác định mức ưu tiên (thông tin thường hay lỗi).

Ví dụ

#include <stdio.h>

#define INFO 1
#define ERR 2
#define STD_OUT stdout
#define STD_ERR stderr

#define LOG_MESSAGE(pr, strm, msg, ...) do { \
    char *str; \
    if (pr == INFO) \
        str = "INFORMATION"; \
    else if (pr == ERR) \
        str = "ERROR"; \
    fprintf(strm, "[%s] : %s : %d : " msg "\n", \
        str, __FILE__, __LINE__, ##__VA_ARGS__); \
} while (0)

int main(void) {
    char *s = "Test String";
    LOG_MESSAGE(ERR, STD_ERR, "Unable to open the file"); // thông báo thường
    LOG_MESSAGE(INFO, STD_OUT, "%s is passed as argument", s); // truyền chuỗi
    LOG_MESSAGE(INFO, STD_OUT, "%d + %d = %d", 14, 16, (14 + 16)); // truyền số nguyên
    return 0;
}

Kết quả

[ERROR] : D:\text.c : 21 : Unable to open the file
[INFORMATION] : D:\text.c : 23 : Test String is passed as argument
[INFORMATION] : D:\text.c : 25 : 14 + 16 = 30