将0转为无效

时间:2011-08-09 20:43:13

标签: c++ c macros void

在我的C ++实现(Visual Studio 2008实现)中,我在<cassert>

中看到以下行
#ifdef  NDEBUG
#define assert(_Expression) ((void)0)

我不明白需要将0转换为void。在我看来

#ifdef  NDEBUG
#define assert(_Expression) (0)

甚至只是

#ifdef  NDEBUG
#define assert(_Expression) 0
考虑到可以使用assert(expr)的上下文,

会这样做。

那么,在这种情况下, int 类型0的危险是什么,而不是类型 void 的0?任何 现实 示例?

1 个答案:

答案 0 :(得分:22)

复杂表达式(void)0的唯一目的是避免编译器警告。如果你只是一个裸露的,无用的表达式,编译器可能会警告一个无效的表达式。但是通过明确地向void投射某些东西,你表明你的意思是这样做。

(如果编译器突然说“警告:表达式0;无效,请考虑用户会感到多么困惑。”,当你所做的一切都切换到发布模式时。)

这也是C中的常见做法,你要说(void)printf("Hello");告诉编译器你有意选择忽略函数的返回值。

(void)演员表不仅仅是特定实现的选择;它是C标准所要求的。引用2011 ISO C标准(类似的措辞出现在1990和1999版本中):

  

如果 NDEBUG 被定义为源文件中的宏名称   如果包含 <assert.h> ,则 assert 宏定义为

     

<强> #define assert(ignore) ((void)0)

C ++标准要求<cassert>标题的内容与标准C <assert.h>标题相同。