2017-04-12 53 views
1

由于是从爪哇岛正在添加,我wounder为什么编译犯规的类似警告约可达代码:为什么我可以用2个返回来编译代码?

int main(int argc, char** argV) 
{ 

    std::list<int> lst = {1,2,3,4}; 

    return 0; 



    std::cout << "Done!!!" << std::endl; 
    return 0; 
} 

我的问题:

为什么我编译2个返回代码?

我的编译器是C++ 11,在Windows上,代码块

+1

你能想到你不应该能够的原因吗? –

+1

'为什么编译器不警告'并且您的警告级别设置是...? – deviantfan

回答

5

我wounder为什么编译器警告犯规像

在一些关于不可达代码,它在GCC documentaion很好解释有关的警告:

-Wunreachable码

如果编译器检测到代码永远不会被执行,则发出警告。此选项旨在警告编译器检测到 至少会有一整行源代码将永远不会执行,因为某些条件永远不会得到满足或者因为它在永不返回的过程之后会发出警告。

有可能使该选项产生警告,即使有 是哪些情况下删除明显执行不到 代码时,受影响的产品线的一部分可以 执行,所以应小心。

例如,当函数内联时,警告可能意味着 行仅在一个内联函数副本中不可访问。

此选项,因为在程序的调试版本 不进行-Wall的一部分,经常有大量的代码,检查程序的正确 运作,是,希望访问,因为 程序做的工作。不可达代码的另一个常见用途是 提供可在编译时选择的行为。

尽管启用此选项g ++ 5.1.0不会为此代码产生任何警告。

0

GCC因为这部分

std::cout << "Done!!!" << std::endl; 
return 0; 

将永远不会被调用,因为第一return声明的,但它是不是一个错误中止编译,而编译器可能会放弃警告,这取决于你使用的是什么编译器(例如,Microsofts VC++编译器就此提醒你)。

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 

最糟糕的根据我的拙见,这两个世界都是可以实现的。

+0

相关:Java常常警告*,因为像所说的100%正确性是不可能的。不仅用于可达性的事情,而且还用于代码路径之类的事情,而不需要初始化等。 – deviantfan

0

无法访问的代码在C++中不是编译错误,但通常会给出警告,具体取决于您的编译器和标志。

当您调用编译器时,您可以尝试添加-Wall选项。这会对 激活很多有用的警告。

+0

- 检查墙! –

+0

它需要-Wunreachable-code不包括在-Wall – Slava

0

有两个原因:

  1. C++有许多标准(C++ 11,C++ 14,C++ 17等)与Java(Java是在标准非常刚性的,并且只有对于Java来说真正重要的是你使用的版本),所以,一些编译器可能会警告你关于无法访问的代码,而另一些则可能不会。

  2. return 0之后的语句虽然在逻辑上无法访问,但不会导致任何致命错误,如歧义,语法错误等,并且可以轻松编译(如果编译器要;))。

+0

'C++有许多标准(C++ 11,C++ 14,C++ 17等)不像java'不像Java。 Java语言也有版本,这不等于软件版本。 – deviantfan

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 

大约十年前,人们不赞成具有方法的功能不止一个回报,但实际上没有理由继续用现代编译器对它进行皱眉。

相关问题