সি-তে ফাংশনের মতোই ম্যাক্রোতে ভেরিয়েবল সংখ্যক আর্গুমেন্ট নেওয়া যায়। এর জন্য ... (এলিপসিস) এবং __VA_ARGS__ ব্যবহার করা হয়। কনক্যাটেনেশন অপারেটর ## দিয়ে আর্গুমেন্টগুলো একসাথে জোড়া দেয়া হয়।
সিনট্যাক্স
#define MACRO_NAME(param, ...) do { ... __VA_ARGS__ ... } while(0)
__VA_ARGS__: ভেরিয়েবল আর্গুমেন্টগুলোকে রিপ্রেজেন্ট করে##__VA_ARGS__: যদি কোনো আর্গুমেন্ট না থাকে তবে কমা (,) রিমুভ করে (GCC এক্সটেনশন)do { ... } while(0): ম্যাক্রোকে সেফ ব্লকে বাঁধার ইডিওম
উদাহরণ: লগিং ম্যাক্রো
#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");
LOG_MESSAGE(INFO, STD_OUT, "%s is passed as argument", s);
LOG_MESSAGE(INFO, STD_OUT, "%d + %d = %d", 14, 16, (14 + 16));
return 0;
}
আউটপুট
[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
ব্যাখ্যা
__FILE__এবং__LINE__প্রিপ্রসেসর ম্যাক্রো — ফাইল নাম এবং লাইন নম্বর দেয়##__VA_ARGS__ব্যবহার করা হয়েছে যাতে কোনো এক্সট্রা আর্গুমেন্ট না থাকলে কমা-রিলেটেড এরর নাও হয়do-while(0)ব্লক ম্যাক্রোকে সেমিকোলন দিয়ে এক স্টেটমেন্টর মতো ব্যবহার করতে দেয়
স্ট্যান্ডার্ড নোট
- C99 স্ট্যান্ডার্ড থেকে
__VA_ARGS__সাপোর্ট করা হয় - C23-এ
__VA_OPT__এড হয়েছে আরও ফ্লেক্সিবিলিটির জন্য