当前位置:  开发笔记 > 编程语言 > 正文

铸造到'void'真的有什么作用?

如何解决《铸造到'void'真的有什么作用?》经验,为你挑选了2个好方法。

经常使用的语句(void)x;允许禁止有关未使用变量的警告x.但是如果我尝试编译以下内容,我会得到一些我不太了解的结果:

int main()
{
    int x;
    (short)x;
    (void)x;
    (int)x;
}

用g ++编译它,我得到以下警告:

$ g++ test.cpp -Wall -Wextra -o test
test.cpp: In function ‘int main()’:
test.cpp:4:13: warning: statement has no effect [-Wunused-value]
     (short)x;
             ^
test.cpp:6:11: warning: statement has no effect [-Wunused-value]
     (int)x;
           ^

因此,我得出结论,转换为void与任何其他类型的转换非常不同,是目标类型相同decltype(x)或不同的东西.我猜测可能的解释是:

这只是一个惯例,(void)x;但其他演员不会抑制警告.所有陈述同样没有任何效果.

这种差异在某种程度上与事实有关,而事实void x;并非如此short x;.

哪一项更正确?如果没有,那么如何解释编译器警告的差异?



1> Rahul Tripat..:

Casting to void用于抑制编译器警告.该标准说,在§5.2.9/ 4说,

可以将任何表达式显式转换为"cv void"类型.表达式值将被丢弃.



2> John Zwinck..:

这个说法:

(void)x;

说"忽略x的价值".没有这样的类型void- 没有类型.所以它与此截然不同:

(int)x;

其中说"将x视为整数".忽略结果整数时,会收到警告(如果已启用).

当你忽略一些什么都不是的东西时,它不被GCC认为是一个问题 - 并且有充分的理由,因为转换为void是在C和C++中显式忽略变量的惯用方法.


我很确定有"像`void`这样的类型".见[basic.types].
将返回结果强制转换为void(`(void)foo()`)表示您故意忽略了返回值,这将更为有用。我唯一可以将变量图像转换为void的图像是,如果该变量仅在某些#ifdef代码中使用,并且您想在不包含该代码时取消显示警告。
推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有