हम जानते हैं कि हम सी में कार्यों के लिए परिवर्तनीय लंबाई तर्कों का उपयोग कर सकते हैं। इसके लिए हमें इलिप्सिस (...) का उपयोग करना होगा। इसी तरह मैक्रोज़ के लिए, हम वेरिएबल लेंथ तर्कों का उपयोग कर सकते हैं। यहां हमें इलिप्सिस को भी शामिल करना है, '__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"); //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 }
आउटपुट
[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