【发布时间】:2011-10-23 13:57:55
【问题描述】:
在我的 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 有什么危险呢?有任何现实示例吗?
【问题讨论】:
-
顺便说一句,虽然这对许多人来说似乎是一个微不足道的问题,但实际上我偶尔会遇到经验不足的程序员问这个话题。它类似于(但不是重复)关于为什么宏通常包含在
do ... while(0)构造中的问题。有时,一个人的“太明显而不会被打扰”是另一个人的“WTF?!?”。