Chúng ta biết rằng chúng ta có thể sử dụng các đối số có độ dài thay đổi cho các hàm trong C. Để làm được điều đó, chúng ta phải sử dụng dấu chấm lửng (…). Tương tự đối với macro, chúng ta có thể sử dụng các đối số có độ dài thay đổi. Ở đây chúng ta cũng phải bao gồm dấu chấm lửng, ‘__VA_ARGS__’ được sử dụng để xử lý các đối số có độ dài thay đổi. Toán tử nối ‘##’ được sử dụng để nối các đối số biến.
Trong ví dụ này, Macro sẽ nhận đối số độ dài thay đổi như hàm printf () hoặc scanf (). Trong macro này, chúng tôi sẽ in tên tệp, số dòng và thông báo lỗi. Đối số đầu tiên là pr. Điều này được sử dụng để xác định mức độ ưu tiên, tức là đó là chuỗi thông tin bình 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"); //here normal message will be printed LOG_MESSAGE(INFO, STD_OUT, "%s is passed as argument", s); //pass string argument LOG_MESSAGE(INFO, STD_OUT, "%d + %d = %d", 14, 16, (14 + 16)); //Provide integer }
Đầu ra
[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