C99 मानक ने मैक्रोज़ के लिए वेरिएबल आर्गुमेंट्स (वेरिएडिक मैक्रोज़) का समर्थन पेश किया, __VA_ARGS__ और कन्केटिनेशन ऑपरेटर ## का उपयोग करके।
सिंटैक्स
#define MACRO_NAME(param, ...) __VA_ARGS__
मुख्य तत्व
...(इलिप्सिस): वेरिएबल आर्गुमेंट्स दर्शाता है।__VA_ARGS__: सभी वेरिएबल आर्गुमेंट्स को एक्सपैंड करता है।##(टोकन पेस्टिंग):##__VA_ARGS__कॉमा समस्या हल करता है जब कोई वेरिएबल आर्गुमेंट नहीं दिया जाता।
उदाहरण: लॉगिंग मैक्रो
#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] : test.c : 21 : Unable to open the file [INFORMATION] : test.c : 23 : Test String is passed as argument [INFORMATION] : test.c : 25 : 14 + 16 = 30
व्याख्या
do { ... } while(0): मैक्रो को सिंगल स्टेटमेंट जैसा व्यवहार करने के लिए (सेमीकॉलन के साथ उपयोग हेतु)।##__VA_ARGS__: जब कोई वेरिएबल आर्गुमेंट नहीं होता, तो पूर्ववर्ती कॉमा को हटा देता है।__FILE__,__LINE__: प्रीडिफाइंड मैक्रोज़ फाइल नाम और लाइन नंबर के लिए।
उपयोग के मामले
- लॉगिंग/डीबगिंग मैक्रोज़
- वेरिएडिक फंक्शन रैपर्स
- जेनेरिक कंटेनर/एल्गोरिदम मैक्रोज़