【发布时间】:2015-04-10 15:24:22
【问题描述】:
我在 C 中有以下代码:
int do_something(void);
#ifdef SOMETHING
#define DO_SOMETHING() do_something()
#else
#define DO_SOMETHING() 0
#endif
在未定义 SOMETHING 的情况下编译时,此代码会产生警告“声明无效”。我正在尝试修复它,但有一个问题 - 使用此宏的代码有时会检查“返回值”,有时会忽略它。因此,我无法使用最简单的解决方案 - 在宏本身中强制转换为 void。
是否可以编写允许比较“返回值”并且在忽略时不产生此警告的宏?
我使用 gcc 来编译我的代码。
【问题讨论】:
-
什么都不做的经典方法是
#define DO_SOMETHING() ((void)0)。演员表停止编译器抱怨“无效的声明”。但是,如果您实际上有时会使用结果(因为do_something()返回int,所以您应该使用该结果),那么它的帮助不如虚拟函数。另请参阅C#definemacro for debug printing。