首页 文章

将0转为无效

提问于
浏览
11

在我的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 回答

  • 22

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

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

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

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

    如果在包含<assert.h>的源文件中将NDEBUG定义为宏名称,则断言宏仅定义为#define assert(ignore)((void)0)

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

相关问题