功能宏,其值为零,可用作语句

前端之家收集整理的这篇文章主要介绍了功能宏,其值为零,可用作语句前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们有一个函数宏#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)

猜你在找的C&C++相关文章