Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将0转换为无效 我在C++实现中(Visual Studio 2008实现),我在代码< > /COD> 中看到了以下行_C++_C_Macros_Void - Fatal编程技术网

将0转换为无效 我在C++实现中(Visual Studio 2008实现),我在代码< > /COD> 中看到了以下行

将0转换为无效 我在C++实现中(Visual Studio 2008实现),我在代码< > /COD> 中看到了以下行,c++,c,macros,void,C++,C,Macros,Void,我不理解将0强制转换为无效的必要性。在我看来 #ifdef NDEBUG #define assert(_Expression) (0) 或者干脆 #ifdef NDEBUG #define assert(_Expression) 0 考虑到可以使用assert(expr)的上下文,可以这样做 那么,在这种情况下,int类型的0代替void类型的0有什么危险?任何真实的例子?复杂表达式(void)0的唯一目的是避免编译器警告。如果您只有一个裸露的、无用的表达式,编译器可能会警告一个无效的

我不理解将0强制转换为无效的必要性。在我看来

#ifdef  NDEBUG
#define assert(_Expression) (0)
或者干脆

#ifdef  NDEBUG
#define assert(_Expression) 0
考虑到可以使用
assert(expr)
的上下文,可以这样做


那么,在这种情况下,int类型的0代替void类型的0有什么危险?任何真实的例子?

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

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

这也是C语言中的常见做法,您可以说
(void)printf(“Hello”)
告诉编译器您故意选择忽略函数的返回值

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

如果
NDEBUG
被定义为源文件中某一点的宏名称 如果包含
,则
断言
宏的定义如下:

#定义断言(忽略)((无效)0)


<> > C++标准要求“代码> >代码>标题的内容与标准的C++代码> <代码>标题相同。< /P>在“代码> AsExt>/CODE”的上下文中还有另一个原因:它确保“<代码> Foo= AsScript(VILF);”在调试和发布模式中都引发编译时错误。我们有
static\u cast
。整洁。它不生成代码,也不显示警告,这是正确的,但真正的问题是为什么不仅仅是
#define assert(ignore)
。我唯一的猜测是有些编译器不喜欢空语句。@Gene:原因和Zack所说的一样-它防止了对assert语句的误用,并避免了关于裸分号的警告。别忘了标准要求将
assert()
扩展为“空表达式”。我确信标准中的要求与这里的许多评论一致。但是,对于一个特定的实现来说,这就是所有必要的理由。顺便说一句,虽然这对许多人来说似乎是一个微不足道的问题,但实际上,我有经验较少的程序员偶尔会问这个问题。这类似于(但不是重复的)关于为什么宏经常被包装在
do。。。而(0)
构造。有时,一个人的“太明显而不受打扰”是另一个人的“WTF?!”。
#ifdef  NDEBUG
#define assert(_Expression) 0