函数不返回不是错误?

问题描述 投票:0回答:1

对于大多数主要编译器来说,gcc、clang、nvc 在编译以下代码时仅产生警告(可抑制的警告)的原因是什么。

#include <iostream>

int foo() { return 42; }   
int boo() { foo(); }

int main()
{
    std::cout << boo() << std::endl;
}

我们刚刚发生的事故几乎没有纯粹靠运气而导致人员伤亡,因为这样的代码是硬件供应商代码(准确地说是自动驾驶仪)的一部分,我们无法更改。特定的编译器甚至没有产生警告(仅在函数中只有返回的情况下)。原著认为

{foo();}
是一个表达方式的推理没有意义,但我很难向监督者解释它。

更奇怪的是,在其他情况下,如果没有 return ,编译器会产生错误。在这种情况下,唯一诊断错误的编译器是 MSVC(几乎任何版本)。

c++ undefined-behavior
1个回答
0
投票

问题在于编译器需要考虑一切。

小变化:

int foo() { throw 42; }   
int boo() { foo(); }

不寻常,但完全合法。

foo
中没有“缺少返回语句”,但您需要知道
foo
总是会抛出异常。

这个想法并不完全牵强。如果

foo
被称为
log_and_throw<Exc>
,您会期望它永远不会正常返回。

© www.soinside.com 2019 - 2024. All rights reserved.