每次,我调用下面的C调试宏,我都要传递一些参数。其他编译失败。
#include <stdio.h>
#include <stdlib.h>
#define debug(fmt, ...)\
do{\
fprintf(stdout, "%s(%d) : " fmt, __FUNCTION__, __LINE__, __VA_ARGS__);\
}while(0)
int
main()
{
debug("Debug 1");
}
以下是编译错误:
test.c:12:5:错误:预期表达式 debug(&#34; Debug 1&#34;); ^ test.c:6:70:注意:从宏扩展&#39; debug&#39; fprintf(stdout,&#34;%s(%d):&#34; fmt,功能, LINE , VA_ARGS ); \ 生成^ 1错误。
如果我使用参数调用相同的宏:
debug("Debug 1 %s", "");
编译好没有任何问题。是因为编译器?它在最新的编译器中有效吗?
答案 0 :(得分:3)
Variadic macros允许您一举将一个或多个参数传递给宏。它们不允许您在其位置传递零参数。
如果您不想传递参数,请编写第二个可以使用的宏。
[C99: 6.10.3/4]:
如果宏定义中的标识符列表没有以省略号结尾,在调用a中的参数数量(包括那些不包含预处理标记的参数)类似函数的宏应等于宏定义中的参数个数。 否则,调用中的参数应该多于宏定义中的参数(...
除外)。应该存在一个)
预处理标记来终止调用。
如果其他编译器(例如与Microsoft Visual Studio一起分发的编译器)允许您传递零参数来代替...
,则它是不符合的。如上所述,此规则与实现无关。