【问题标题】:C debug macro: error: expected expression [duplicate]C调试宏:错误:预期的表达式[重复]
【发布时间】:2015-11-18 06:49:03
【问题描述】:

每次,我调用下面的 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: 错误:预期表达式 调试(“调试 1”); ^ test.c:6:70: 注意:从宏“调试”扩展 fprintf(stdout, "%s(%d) : " fmt, FUNCTION, LINE, VA_ARGS);\ ^ 产生 1 个错误。

如果我使用参数调用相同的宏:

debug("Debug 1 %s", "");

它编译得很好,没有问题。是因为编译器吗?它在最新的编译器中工作吗?

【问题讨论】:

  • 顺便说一句,请不要将 C 问题标记为 c++。这是两种不同的语言。
  • 请参阅C #define macro for debug printing,了解有关调试打印宏的全面讨论。请特别注意“单参数变体”和“GCC 特定技术”部分。

标签: c linux debugging macros


【解决方案1】:

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

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

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

如果其他编译器(例如随 Microsoft Visual Studio 一起分发的编译器之一)允许您传递零参数来代替 ...,则它不符合要求。正如您在上面所读到的,此规则不依赖于实现。

【讨论】:

  • VC++ 14.0 编译它没有问题。标准是怎么说的?
  • @Fireho:我做了同样的事情。注: VC++14.0 不是 C 编译器,但值得注意的是,C++14 也说了同样的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
相关资源
最近更新 更多