2012-08-11 33 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