在我的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的危险是什么?任何 realistic 例子?
1 回答
复杂表达式
(void)0
的唯一目的是避免编译器警告 . 如果你只是一个裸露的,无用的表达式,编译器可能会警告一个没有效果的表达式 . 但是通过明确地将某些内容投射到void
,您表明您的意思是这样做 .(如果编译器突然说“警告:表达式
0;
没有效果 . ”,当你所做的一切都切换到发布模式时,想想它会对用户造成多么混乱 . )这也是C中的常见做法,你要说
(void)printf("Hello");
告诉编译器你有意选择忽略函数的返回值 .(void)
演员不仅仅是特定实现的选择;它是C标准所要求的 . 引用2011 ISO C标准(类似的措辞出现在1990年和1999年版本中):C标准要求
<cassert>
标头的内容与标准C<assert.h>
标头相同 .