经常使用的语句(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;
.
哪一项更正确?如果没有,那么如何解释编译器警告的差异?
Casting to void用于抑制编译器警告.该标准说,在§5.2.9/ 4说,
可以将任何表达式显式转换为"cv void"类型.表达式值将被丢弃.
这个说法:
(void)x;
说"忽略x的价值".没有这样的类型void
- 没有类型.所以它与此截然不同:
(int)x;
其中说"将x视为整数".忽略结果整数时,会收到警告(如果已启用).
当你忽略一些什么都不是的东西时,它不被GCC认为是一个问题 - 并且有充分的理由,因为转换为void是在C和C++中显式忽略变量的惯用方法.