我们有一个#define FOO(arg) foo(arg)
带有int foo(const char* bar);
. 当 NDEBUG 被定义时,FOO 被定义为#define FOO(arg) 0
,但是这会导致许多编译器警告,因为在许多情况下 FOO 的返回值没有被使用。该解决方案应与 ANSI C 编译器一起使用并且不会导致警告。我试过了:
(void)0
: 不能分配给变量
static int foo(const char* bar) { return 0; }
: 在某些模块中导致未使用的静态函数警告
static inline int foo(const char* bar) { return 0; }
: 仅适用于 C99 编译器
谢谢你的帮助!
edit1:它有点像跟踪宏,在整个项目中都使用。大多数情况下,它只是用作声明FOO("function x called");
,但在少数情况下我看到了if (FOO("condition a")) { /* some more debug output */ }
。定义了 NDEBUG 并启用了优化后,FOO 应该不会留下任何东西。我没有想出这个,但我必须清理这个烂摊子:)。
edit2:我应该补充一点,对于 gcc 发布版本,使用了这些标志:-O3 -Wall -ansi
编辑3:现在我要使用__inline int dummy() { return 0; }
. __inline 在 ansi 模式下与 VisualC 和 GCC 一起工作。