c – 为什么在Ideone上编译?

前端之家收集整理的这篇文章主要介绍了c – 为什么在Ideone上编译?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
好的,所以我在 Ideone上搞砸了,不小心提交了这段代码,但令我吃惊的是,它实际编译并运行了一个0,0 here的值.
#include <iostream>

using namespace std;

const int five(  )
{
        const int i = 5;
}

int main() {
        cout << five(  ) << endl;
        return 0;
}

然后,我在Visual Studio中尝试这样做,而在Codepad,但是由于five()不返回值,所以无法编译,因为可以预期.我的问题是,当然,为什么这个编译在Ideone,即使代码,我的理解是错误的,不应该编译.

解决方法

简单(来自C 11 6.6.3“退货单”):

Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.

所以编译器几乎被允许做任何它想要的.显然,诊断是我从编译器中选择的,但是有时候可能很难诊断(比如当返回到条件逻辑内部时,函数的“结束”将永远不会达到).

请注意,我使用GCC 4.6.1(使用墙选项)得到以下警告:

test.cpp:8:1: warning: no return statement in function returning non-void [-Wreturn-type]

我不知道什么选择ideone传递给GCC(我想象 – 将会做同样的4.3.4版本,ideone使用).

一些相关信息:

在C中,在某些情况下声明为返回值实际不这样做的函数是可行的;在C中,如果实际使用函数的返回值,它只会导致未定义的行为.预标准C并不总是支持void类型,所以没有返回任何东西的函数通常被声明为显式或隐式地返回int.来自C99 6.9.1 / 12“函数定义”:如果达到终止函数函数,并且调用者使用函数调用的值,则行为是未定义的.

另外,正如几个评论中所提到的,流出main()的结尾被C和C99及更高版本特别处理.

猜你在找的C&C++相关文章