对于大多数主要编译器来说,gcc、clang、nvc 在编译以下代码时仅产生警告(可抑制的警告)的原因是什么。
#include <iostream>
int foo() { return 42; }
int boo() { foo(); }
int main()
{
std::cout << boo() << std::endl;
}
我们刚刚发生的事故几乎没有纯粹靠运气而导致人员伤亡,因为这样的代码是硬件供应商代码(准确地说是自动驾驶仪)的一部分,我们无法更改。特定的编译器甚至没有产生警告(仅在函数中只有返回的情况下)。原著认为
{foo();}
是一个表达方式的推理没有意义,但我很难向监督者解释它。
更奇怪的是,在其他情况下,如果没有 return ,编译器会产生错误。在这种情况下,唯一诊断错误的编译器是 MSVC(几乎任何版本)。
问题在于编译器需要考虑一切。
小变化:
int foo() { throw 42; }
int boo() { foo(); }
不寻常,但完全合法。
foo
中没有“缺少返回语句”,但您需要知道 foo
总是会抛出异常。
这个想法并不完全牵强。如果
foo
被称为 log_and_throw<Exc>
,您会期望它永远不会正常返回。