Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我可以编译一个有2个返回的代码?_C++_Codeblocks_Compiler Warnings_Unreachable Code - Fatal编程技术网

C++ 为什么我可以编译一个有2个返回的代码?

C++ 为什么我可以编译一个有2个返回的代码?,c++,codeblocks,compiler-warnings,unreachable-code,C++,Codeblocks,Compiler Warnings,Unreachable Code,由于我来自一个java岛,我想知道为什么编译器不警告无法访问的代码,比如: int main(int argc, char** argV) { std::list<int> lst = {1,2,3,4}; return 0; std::cout << "Done!!!" << std::endl; return 0; } int main(int argc,char**argV) { 列表lst={1,2,3,4}

由于我来自一个java岛,我想知道为什么编译器不警告无法访问的代码,比如:

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

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

    return 0;



    std::cout << "Done!!!" << std::endl;
    return 0;
}
int main(int argc,char**argV)
{
列表lst={1,2,3,4};
返回0;
std::cout因为这部分

std::cout << "Done!!!" << std::endl;
return 0;
因为这部分

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

std::cout主要是因为编译器往往无法确定(在Java中有过这样做的尝试,但定义可达性的标准已经确定)

在这种情况下,这是显而易见的

<>一些编译器发布了可达性警告,但是C++标准不需要这个。 如果不参考以下内容,则无法完整回答可达性问题:

作为java的最后一个注释,请考虑这两个java片段:

if (true){
    return;
}
; // this statement is defined to be reachable


在我看来,这两个世界中最糟糕的都已经达到了。

主要是因为编译器往往无法确定(在Java中有过这样做的尝试,但定义可达性的标准已经确定)

在这种情况下,这是显而易见的

<>一些编译器发布了可达性警告,但是C++标准不需要这个。 如果不参考以下内容,则无法完整回答可达性问题:

作为java的最后一个注释,请考虑这两个java片段:

if (true){
    return;
}
; // this statement is defined to be reachable


两个世界中最差的是,在我的拙见中。

< P>不可达代码不是C++中的编译错误,但通常根据编译器和标志给出警告。

您可以在调用编译器时尝试添加-Wall选项
激活许多有用的警告。

< P>不可达代码不是C++中的编译错误,但通常会根据编译器和标志发出警告。

您可以在调用编译器时尝试添加-Wall选项
激活许多有用的警告。

有两个原因:

  • 与java不同,C++有许多标准(C++11、C++14、C++17等)(java在标准中非常严格,唯一与java有关的是您使用的版本),因此,一些编译器可能会警告您无法访问的代码,而其他编译器可能不会

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


  • 原因有两个:

  • 与java不同,C++有许多标准(C++11、C++14、C++17等)(java在标准中非常严格,唯一与java有关的是您使用的版本),因此,一些编译器可能会警告您无法访问的代码,而其他编译器可能不会

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


  • 为什么不能编译具有多个返回的代码? 因为代码无法访问?大多数编译器都会发出警告

    但是,我经常看到这样的代码:

       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
    

    大约十年前,人们不赞成在方法的函数中有多个返回,但现在的编译器真的没有理由继续反对它。

    为什么不能编译具有多个返回的代码? 因为代码无法访问?大多数编译器都会发出警告

    但是,我经常看到这样的代码:

       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
    
    大约十年前,人们不赞成在一个方法函数中有多个返回,但现代编译器确实没有理由继续不赞成

    我想知道为什么编译器不会在类似的代码中警告无法访问的代码

    gcc对警告进行了很好的解释:

    -Wunreachable代码

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

    此选项可能会产生警告,即使存在 在何种情况下,受影响线路的一部分可能会受到影响 已执行,因此在删除明显无法访问的 代码

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

    此选项不是-Wall的一部分,因为在调试版本中 在一个程序中,经常有大量的代码检查正确性 由于 程序确实可以工作。不可访问代码的另一个常见用法是 提供可在编译时选择的行为。

    尽管g++5.1.0即使启用了此选项,也不会为此代码生成任何警告

    我想知道为什么编译器不会在类似的代码中警告无法访问的代码

    gcc对警告进行了很好的解释:

    -Wunreachable代码

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

    此选项可能会产生警告,即使存在 在何种情况下,受影响线路的一部分可能会受到影响 已执行,因此在删除明显无法访问的 代码

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

    此选项不是-Wall的一部分,因为在调试版本中 在一个程序中,经常有大量的代码