【发布时间】:2016-03-21 05:18:32
【问题描述】:
像(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;是一个事实有关。
如果有的话,哪一个更正确?如果没有,那么如何解释编译器警告的差异?
【问题讨论】:
-
这种强制转换抑制警告只是编译器之间的约定。 C++ 标准根本没有提到“语句无效”的警告。
-
@cigien 尽管问题表面上很相似,但这个问题询问了转换为
void和转换为其他类型之间的差异机制,而另一个询问了为什么要这样做投射到void。但是,由于这个问题有一个令人满意的答案,我不会费心改变它并投票重新开放。这条评论只是为了回答自动生成的“这能回答你的问题吗?”。 TLDR:不。 -
我明白你在说什么,总的来说,我会将“什么”和“为什么”问题分开。但在这种情况下,“它做什么”与“为什么这样做”方面密切相关,所以我认为值得将它们联系起来。除了禁止警告之外,没有理由这样做(即强制转换为 void),并且两个帖子上的所有答案基本上都说同样的话。
标签: c++ casting compiler-warnings void suppress-warnings