7

我们有一个#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 一起工作。

4

3 回答 3

3

I guess it's a little bit compiler dependent but this should work:

#ifndef NDEBUG
    #define FOO(arg) foo(arg)
#else
    #define FOO(arg) ((int)0)
#endif

It prevents the "expression has no effect" warning, it does nothing and its value when used is still 0.

EDITED
It seems it's something not so portable so (now) you have these conditions:

  • (0) or ((int)0) work at least on VC 2010.
  • __noop should work on any version of VC after 2003.

VC6 is not a problem because it doesn't emit the C4555 warning at all. For other compilers you may use:

  • ((void)0, 0) It may work on a lot of compilers (maybe it's the more portable one?).
  • inline int foo(const char* bar) { return 0; } works with any other C99 compiler (as you wrote you may need to declare it as static on gcc).

For any other prehistoric C compiler use the solution pointed by @Jobs: abs(0)

于 2012-04-17T13:15:47.940 回答
2

可以采取以下措施来防止警告:

#ifndef NDEBUG
    #define FOO(arg) foo(arg)
#else
    #define FOO(arg) abs(0)
#endif

我并不是说这是理想的(例如,您必须确保stdlib.h在任何地方都包含在内),但它确实可以防止警告。

于 2012-04-17T12:06:39.450 回答
1

我会做一些依赖于 C 版本的事情。在头文件中:

#if __STDC_VERSION__ > 199900L
inline int foo(const char* bar) { return 0; }
#else
int foo(const char* bar);
#endif

在一个编译单元中

#if __STDC_VERSION__ < 199900L
int foo(const char* bar) { return 0; }
#else
int foo(const char* bar);
#endif

或用于旧的 C 版本,例如 Job's answer,这是一个肯定会被优化但不会产生警告的函数。

于 2012-04-17T12:48:20.257 回答