由于我来自一个java岛,我想知道为什么编译器没有警告无法访问的代码如下:
int main(int argc, char** argV)
{
std::list<int> lst = {1,2,3,4};
return 0;
std::cout << "Done!!!" << std::endl;
return 0;
}
我的问题:
为什么我可以编译带有2个返回的代码?
我的编译器是gcc for c ++ 11,在Windows上,代码块
答案 0 :(得分:5)
我觉得为什么编译器没有警告像
这样的无法访问的代码
gcc documentaion中有关警告的解释很清楚:
-Wunreachable-code
如果编译器检测到永远不会执行代码,则发出警告。此选项用于在编译器检测到时发出警告 至少整行源代码将永远不会被执行, 因为某些条件永远不会满足,或者因为它是在a之后 永远不会回来的程序。
即使存在警告,此选项也可能产生警告 是受影响的部分线路可以的情况 已执行,因此在删除明显无法访问时应小心谨慎 代码。
例如,当内联函数时,警告可能意味着 只能在函数的一个内联副本中找不到行。
此选项不是-Wall的一部分,因为在调试版本中 一个程序通常有大量的代码检查正确 该计划的运作,并希望无法到达,因为 程序确实有效。无法访问代码的另一个常见用途是 提供在编译时可选择的行为。
尽管g ++ 5.1.0即使启用了此选项也不会对此代码产生任何警告。
答案 1 :(得分:1)
为什么不能编译具有多个返回的代码? 因为代码无法访问?大多数编译器都可以发出警告。
但是,我经常会看到如下代码:
if(a)
{
// Do stuff
}
else
{
// Do other stuff
if(b)
{
// Do more stuff
}
else
{
// Do other more stuff
}
}
可以简化为
if(a)
{
// Do stuff
return;
}
// Do other stuff
if(b)
{
// Do more stuff
return;
}
// Do other more stuff
大约十年前,人们对方法功能不止一次回归感到不满,但实际上没有理由继续用现代编译器对它进行皱眉。
答案 2 :(得分:0)
因为这部分
<div onClick="window.open('file\'sname.jpg);">
Wont open
</div>
由于第一个std::cout << "Done!!!" << std::endl;
return 0;
语句,永远不会被调用,但是中止编译并不是错误,而是编译器可能会发出警告,具体取决于您使用的编译器(例如,微软VC ++编译器警告您关于那个)。
答案 3 :(得分:0)
主要是因为编译器经常无法确定。 (已尝试在Java中执行此操作,但已确定了定义可达性的标准。)
在这种情况下,确实很明显。
有些编译器会发出可访问性警告,但C ++标准不需要这样做。
如果没有引用此问题,则无法完成可访问性的答案:https://en.wikipedia.org/wiki/Halting_problem
作为对Java的最后评论,请考虑以下两个Java代码段:
if (true){
return;
}
; // this statement is defined to be reachable
和
while (true){
return;
}
; // this statement is defined to be unreachable
在我的拙见中,两个世界中最糟糕的都达到了。
答案 4 :(得分:0)
无法访问的代码在C ++中不是编译错误,但通常会发出警告,具体取决于您的编译器和标志。
您可以在调用编译器时尝试添加-Wall选项。这将 积极的许多有用的警告。
答案 5 :(得分:0)
这有两个原因:
与java不同,C ++有许多标准(c ++ 11,c ++ 14,c ++ 17等)(java在标准中非常严格,只有与java有关的东西才是你的版本因此,有些编译器可能会警告您无法访问的代码,而其他编译器则可能没有。
return 0
之后的语句虽然在逻辑上是无法访问的,但不会导致任何致命错误,如歧义,语法错误等,并且可以轻松编译(如果编译器将要执行;)。 / p>