C调试宏:错误:预期表达式

时间:2015-08-24 18:27:42

标签: c linux debugging macros

每次,我调用下面的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", "");

编译好没有任何问题。是因为编译器?它在最新的编译器中有效吗?

1 个答案:

答案 0 :(得分:3)

Variadic macros允许您一举将一个或多个参数传递给宏。它们不允许您在其位置传递零参数。

如果您不想传递参数,请编写第二个可以使用的宏。

  

[C99: 6.10.3/4]: 如果宏定义中的标识符列表没有以省略号结尾,在调用a中的参数数量(包括那些不包含预处理标记的参数)类似函数的宏应等于宏定义中的参数个数。 否则,调用中的参数应该多于宏定义中的参数(...除外)。应该存在一个)预处理标记来终止调用。

如果其他编译器(例如与Microsoft Visual Studio一起分发的编译器)允许您传递零参数来代替...,则它是不符合的。如上所述,此规则与实现无关。