C调试宏的奇怪语法

时间:2015-05-11 20:58:38

标签: c syntax

有人可以向我解释下面的C语法(来自这个tutorial)吗?我知道这是C的一个宏,但是" DEBUG%s:%d:" M" \ n"
部分对我来说很奇怪:为什么有宏观参数' M'在格式部分的中间?

#define debug(M, ...) fprintf(stderr, 
            "DEBUG %s:%d: " M "\n", __FILE__, __LINE__, ##__VA_ARGS__)

3 个答案:

答案 0 :(得分:4)

C有一个有趣的怪癖,它连接字符串文字。如果您输入

"DEBUG %s:%d: " "HELLO %s!" "\n"

然后编译器将其视为一个字符串:"DEBUG %s:%d: HELLO %s!\n"。因此,用户可以像使用printf参数一样使用此宏:

debug("HELLO %s", username); //on line 94 of myfile.cpp

并且宏将自动添加文件名和行号。此格式很有用,因为它可以帮助您了解哪个调试语句正在记录信息。

DEBUG myfile.cpp:94: HELLO zell

答案 1 :(得分:3)

debug("This should never happen!");

评估为

fprintf(stderr, "DEBUG %s:%d: " "This should never happen!" "\n", __FILE__, __LINE__, ##__VA_ARGS__)

哪个连接到......

fprintf(stderr, "DEBUG %s:%d: This should never happen!\n", __FILE__, __LINE__, ##__VA_ARGS__)

所以它打印出类似......

的东西

DEBUG foo.c:51: This should never happen!

答案 2 :(得分:2)

字符串在C中自动连接在一起。" Hello" "世界&#34!;和#34; Hello World!"相同。 DEBUG("打开文件%s",文件名时发生错误) 扩展到: fprintf(stderr," DEBUG%s:%d:打开文件%s \ n",__ FILE __,_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 我认为你同意的是非常方便和正确的结果。