将0转为无效

在我的C ++实现(Visual Studio 2008实现)中,我在看到以下行

 #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而不是0类型为0的危险是什么? 任何现实的例子?

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

(如果编译器突然说“警告:表达式0;没有效果。”,当你所做的一切都切换到发布模式时,想想它会给用户带来多么混乱。)

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

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

如果NDEBUG被定义为源文件中包含的点的宏名称,则assert宏被简单地定义为

#define assert(ignore) ((void)0)

C ++标准要求标头的内容与标准C 标头相同。