C++ 为什么我可以编译一个有2个返回的代码?
由于我来自一个java岛,我想知道为什么编译器不警告无法访问的代码,比如: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}
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的一部分,因为在调试版本中
在一个程序中,经常有大量的代码