2012-08-11 36 views
3

Possible Duplicate:
Can main function call itself in C++?调用C++的主要功能是使用代码块

我决定通过调用这应该是一种非法行为的主要功能做使用的代码块IDE一个小的测试忽略。

EX:

#include <iostream> 
using namespace std; 

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

奇怪的是,在代码块,我能够编译这个烂摊子。有谁知道为什么?

输出:你好

+0

CodeBlocks是一个IDE而不是编译器。你使用什么编译器? – Marlon 2012-08-11 18:05:41

+0

我得到无限的亲爱的。 – mfontanini 2012-08-11 18:06:20

+2

为什么你认为从'main'调用'main'是非法的? – 2012-08-11 18:06:37

回答

8

正如您在您的问题本身中所说的,明确从您的代码中调用main()被语言规范禁止。只有运行时才能调用它。

当您使用GCC编译您的代码(阅读您的评论)时,-pedantic选项会以错误或警告的形式为您提供适当的诊断。所以,试试这个:

g++ program.cpp -pedantic 
+0

我只是想知道我是如何配置代码块? – 2012-08-22 13:49:40

+0

@mekici:对不起,我无法帮助你,因为我没有使用CodeBlock的经验。不过,谷歌可能会帮助你。 :-) – Nawaz 2012-08-22 14:48:59

+0

太多了。我用MinGW(当然是在Windows上)使用Microsoft Visual Studio 2010和某个时候的[Vim(图形化的)](http://www.vim.org/download.php)。你也可以看到[Eclipse](http://www.eclipse.org/downloads/) – Nawaz 2012-08-22 15:07:35

0

您可以在主function.main所有任何功能也是一个函数,它由编译器是触发在运行。是非法行为,但可以调用main下的main函数。调用主要隐性下的main函数并运行无限次。在VS2008中,你会得到一个警告来调用main函数,但程序运行没有任何问题。

+0

那么为什么这个编译器或IDE不会警告我这种迫在眉睫的危险?除此之外,为什么它会完全省略调用主函数的代码行来产生以下输出:“hello”? – user1299661 2012-08-11 18:21:29

1
cout<<"hello"<<endl; 
**main();** 
return 0; 

第二行的main()将导致与main()函数连连自称无限递归循环,这反过来会导致在你的代码的返回值的路径。

因为不是所有的路径都返回值,所以没有C编译器会编译它。忘记C,即使C#编译器发现所有路径都没有返回值,但它的代码是清晰的。

+0

奇怪的是它甚至不创建合理的递归循环。 – user1299661 2012-08-11 18:23:13

+1

那是因为你使用了GCC编译器,它有自己的规则,或者也许它需要你,程序员来处理这些事情。尝试使用Microsoft编译器 - 您将无法做到这一点。 – 2012-08-11 18:27:10

+1

更新:出于好奇,我试着用MinGW和Microsoft CL编译器编译你的代码。如预期的那样,MinGW编译它,但是cl抛出这个错误:d:\ source \ c \ test.cpp(9):警告C4717:'main':递归在所有控制路径上,函数会导致运行时堆栈溢出 Microsoft )增量链接器版本9.00.30729.01 版权所有(C)Microsoft Corporation。版权所有。 /out:test.exe test.obj – 2012-08-11 18:32:06