编译器未强制执行退货合同

时间:2017-07-18 16:30:53

标签: c++

以下代码

int foo(int a = 10, int b = 20);

int foo(int a, int b)
{
    std::cout << a + b;
}

int main()
{
    foo();
}

我没有收到编译错误。相反,我得到了这个

  

错误(S):   无效的内存引用(SIGSEGV)   3030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303

任何想法为什么编译器根本没有错误地说你忘记返回函数原型中承诺的int?

这是在clang上

3 个答案:

答案 0 :(得分:2)

  

任何想法为什么编译器根本不会错误地说你忘记返回函数原型中承诺的int?

主要是因为不需要。标准表示不从非空函数返回具有未定义的行为。

并且,因为可能是编译器的作者决定警告就足够了。

答案 1 :(得分:1)

编译器不输出错误,因为它没有。标准说它应该是未定义的行为,因此不需要诊断。

但是,您可能希望启用警告,甚至可能将该警告视为错误。

在GCC中,通过添加以下参数来完成:

-Werror=return-type

答案 2 :(得分:1)

因为在一般情况下无法确定这一点,所以标准将其定义为未定义 (如果内存服务,它将涉及解决暂停问题,你可以证明这是不可能的。)

您可以做的最好的事情是提高警告级别并将警告视为错误。