c++ - 将 0 转换为 void

标签 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 有什么危险?有什么现实的例子吗?

最佳答案

复杂表达式的唯一目的(void)0是为了避免编译器警告。如果您只有一个裸露的、无用的表达式,编译器可能会警告表达式无效。但是通过显式地将某些内容转换为 void你表明你打算这样做。

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

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

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

If NDEBUG is defined as a macro name at the point in the source file where <assert.h> is included, the assert macro is defined simply as

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

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

关于c++ - 将 0 转换为 void,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7002719/

相关文章:

c++ - free() 后面紧跟 NULL 赋值怎么会导致悬空指针?

c++ - 尽管在 OpenFEC 库中链接,但 undefined reference

c - 函数 strcpy 总是危险的吗?

c - 循环遍历并将数据分配给结构成员的宏错误地将结构成员识别为指针

将数据转换为代码

c++ - 是否有宏或规定来检查代码行是否在类中?

c++ - Eclipse CDT C++ 错误

c++ - 如何以原子方式在 C++ 编码中执行 xchg 汇编指令

c++ - #define 宏中的特殊字符

c - C中返回状态的初始值应该是多少?