2013-03-11 101 views
5

作爲來自python的C++的新手,我不確定爲什麼C++不允許代碼在函數之外(在全局命名空間中?)。在main()被調用之前做一些初始化或者甚至聲明瞭其他函數之前,這似乎是有用的。 (我不想與編譯器爭論,我只想知道以這種方式實現它後面的思考過程。)爲什麼必須在函數中包含C++代碼?

+0

如果沒有函數,這樣的代碼將如何執行? – 2013-03-11 05:38:59

+0

在'main'之前還有一些方法可以在不涉及混亂的全局代碼的情況下執行代碼。 – chris 2013-03-11 05:39:14

+1

似乎沒有那麼有用。 – 2013-03-11 05:39:56

回答

12

當你運行一個python程序時,解釋器從頭到尾底部正在執行。在C++中,這不會發生。編譯器將所有函數構建成小塊的機器代碼,然後鏈接器將它們掛鉤。在運行時,操作系統調用您的main函數,並且從那裏開始一切。在這種情況下,函數之外的代碼是毫無意義的 - 它何時會運行?

+0

這個答案幫助了很多關鍵的想法,我有點在我的學習C++淡化;即它是一種編譯語言。 – 2013-03-11 05:48:51

+0

我假設這也是C的情況? – 2013-03-11 05:55:33

+0

是的,C也是一樣。 – 2013-03-11 05:57:17

1

main()是程序的接入點。所以你想寫的任何代碼都需要從那一點開始執行。

靜態變量在執行main()之前啓動,因此您可以在此之前啓動所需的任何變量。

但是,如果你想運行啓動程序狀態的代碼,你應該在程序開始時執行它,並濫用靜態變量併爲其構造一些構造函數。

3

這可以認爲是C++和Python之間的風格差異。但是,它也有很好的理由。在C和C++中,代碼的執行起始於一個非常明確和特定的地方,這就是函數的開始(當然,這只是對事實的近似,但我們現在可以忽略這一點)實際上,一個C/C++程序以main()函數開始和結束,在我看來,這個函數有很多幫助,當你想了解一個程序實際上做了什麼。程序的高層流程更清晰。將這與另一種對比;代碼分散在整個文件中,在函數和whatnot之間。

即使在一個組織良好,非平凡的Python程序中,您也可以將主體代碼置於if __name__ == "__main__":之下,不是嗎?

現在對於一些更高級的東西。有些方法可以在調用main()函數之前運行代碼。這裏是其中的一個:

#include <iostream> 
using namespace std; 

bool RunBeforeMain() 
{ 
    cout << "Before main()!" << endl; 
    return true; 
} 

// This variable here causes the above function to be called 
bool ignore_this_variable = RunBeforeMain(); 

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

此外,所有的全局變量的構造函數和所有的類static成員和一些平臺相關的東西都main()之前運行。類似地,在main()完成後,代碼可以運行。這些通常是在main()開始之前構建的對象的破壞者,以及用atexit()函數註冊的函數。

相關問題