与函数一样,我们也可以将变长参数传递给宏。为此,我们将使用以下预处理器标识符。 为了在宏中支持可变长度参数,我们必须在宏定义中包含省略号(…)。还有一个“_VA_ARGS__”预处理标识符,它负责提供给宏的可变长度参数替换。串联运算符##(又称粘贴运算符)用于串联变量参数。 让我们举个例子看看。下面的宏采用可变长度参数,比如“printf()”函数。此宏用于错误记录。宏打印文件名,后跟行号,最后打印信息/错误消息。第一个参数“prio”确定消息的优先级,即它是信息消息还是错误,“stream”可以是“标准输出”或“标准错误”。它在stdout上显示信息消息,在stderr流上显示错误消息。
null
C
#include <stdio.h> #define INFO 1 #define ERR 2 #define STD_OUT stdout #define STD_ERR stderr #define LOG_MESSAGE(prio, stream, msg, ...) do { char *str; if (prio == INFO) str = "INFO"; else if (prio == ERR) str = "ERR"; fprintf (stream, "[%s] : %s : %d : "msg" ", str, __FILE__, __LINE__, ##__VA_ARGS__); } while (0) int main( void ) { char *s = "Hello"; /* display normal message */ LOG_MESSAGE(ERR, STD_ERR, "Failed to open file"); /* provide string as argument */ LOG_MESSAGE(INFO, STD_OUT, "%s Geeks for Geeks", s); /* provide integer as arguments */ LOG_MESSAGE(INFO, STD_OUT, "%d + %d = %d", 10, 20, (10 + 20)); return 0; } |
编译并运行上述程序,结果如下。
[narendra@/media/partition/GFG]$ ./variable_length [ERR] : variable_length.c : 26 : Failed to open file [INFO] : variable_length.c : 27 : Hello Geeks for Geeks [INFO] : variable_length.c : 28 : 10 + 20 = 30 [narendra@/media/partition/GFG]$
本文由什里扬·比斯瓦斯编辑。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写评论
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END