我们有一个函数宏#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(“函数x调用”)的语句;但在少数情况下,我看到了(FOO(“条件a”)){/ *更多调试输出* /}.在NDEBUG定义和优化的情况下,FOO不应该留下任何东西.我没有拿出这个,但我必须清理这个烂摊子:).
edit2:我应该补充说,对于gcc发布版本,使用了这些标志:-O3 -Wall -ansi
edit3:现在我要用__inline int dummy(){return 0; }. __inline在ansi模式下与VisualC和GCC一起使用.
解决方法
我想它有点依赖编译器,但这应该工作:
#ifndef NDEBUG #define FOO(arg) foo(arg) #else #define FOO(arg) ((int)0) #endif
它可以防止“表达无效”警告,它什么都不做,使用时它的值仍为0.
EDITED
它似乎不那么便携,所以(现在)你有这些条件:
>(0)或((int)0)至少在VC 2010上工作.
> __noop应该适用于2003年之后的任何版本的VC.
VC6不是问题,因为它根本不发出C4555警告.对于其他编译器,您可以使用:
>((void)0,0)它可能适用于很多编译器(可能是更便携的编译器?).
> inline int foo(const char * bar){return 0;适用于任何其他C99编译器(如您所写,您可能需要在gcc上将其声明为静态).
对于任何其他史前C编译器使用@Jobs指向的解决方案:abs(0)