2015-05-11 57 views
3

任何人都可以向我解释下面的C语法(从这个tutorial)?我知道这是一个C宏,但“DEBUG%s:%d:”M“\ n”
部分对我来说似乎很奇怪:为什么格式部分中间有宏参数'M'?C调试宏的奇怪语法

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

这很迷人!很酷!我喜欢!我以前从未见过一种强制参数为文字的方法,但这是一个诀窍! –

+1

必须有一个反斜杠丢失? – wildplasser

+0

@MooingDuck:所以你读了这篇文章,和OP(和我)不同,*立即*将它删除了?对于你得到的C来说,这真是一个诀窍。 – usr2564301

回答

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 
2

字符串在C中自动连接在一起。“Hello”“World!”与“Hello World!”相同。

DEBUG("An error occurred opening file %s", filename) 

扩展为:

fprintf(stderr, "DEBUG %s:%d: An error occurred opening file %s\n", __FILE__, __LINE__, filename) 

这一点我想你会同意是非常方便的和正确的结果。

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!