作爲來自python的C++的新手,我不確定爲什麼C++不允許代碼在函數之外(在全局命名空間中?)。在main()被調用之前做一些初始化或者甚至聲明瞭其他函數之前,這似乎是有用的。 (我不想與編譯器爭論,我只想知道以這種方式實現它後面的思考過程。)爲什麼必須在函數中包含C++代碼?
回答
當你運行一個python程序時,解釋器從頭到尾底部正在執行。在C++中,這不會發生。編譯器將所有函數構建成小塊的機器代碼,然後鏈接器將它們掛鉤。在運行時,操作系統調用您的main
函數,並且從那裏開始一切。在這種情況下,函數之外的代碼是毫無意義的 - 它何時會運行?
這個答案幫助了很多關鍵的想法,我有點在我的學習C++淡化;即它是一種編譯語言。 – 2013-03-11 05:48:51
我假設這也是C的情況? – 2013-03-11 05:55:33
是的,C也是一樣。 – 2013-03-11 05:57:17
main()是程序的接入點。所以你想寫的任何代碼都需要從那一點開始執行。
靜態變量在執行main()之前啓動,因此您可以在此之前啓動所需的任何變量。
但是,如果你想運行啓動程序狀態的代碼,你應該在程序開始時執行它,並濫用靜態變量併爲其構造一些構造函數。
這可以認爲是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()
函數註冊的函數。
- 1. 爲什麼我必須包含索引?
- 2. 爲什麼我必須在setTimeout中包裝函數?
- 3. 必須包含\ n Xcode C
- 4. 什麼包必須在AS2
- 5. 什麼時候必須要在C++類中定義析構函數,爲什麼?
- 6. 爲什麼我必須在這段代碼中使用(flush)?
- 7. 爲什麼必須將代碼放在「runonuithread」方法中?
- 8. 爲什麼你必須用匿名函數包裝回調?
- 9. 爲什麼必須N-1在C
- 10. 爲什麼我必須玩「rsp」才能調用C++函數?
- 11. 爲什麼必須在哈希錶鏈接的C++代碼中輸入密鑰
- 12. 爲什麼你必須鏈接庫和設置包含目錄
- 13. 爲什麼我必須使用Font-Awesome包含字體文件?
- 14. 爲什麼一個type = html gadget必須包含CDATA部分?
- 15. 爲什麼'jQuery'必須傳入此函數(請參閱最後一行代碼)?
- 16. 爲什麼虛擬函數必須在超類中實現?
- 17. 在異步函數中,爲什麼我必須等待?
- 18. 爲什麼我必須在函數中附上jQuery命令
- 19. 初學者AJAX課程 - 爲什麼我必須在函數中包裝request.readyState?
- 20. 我們必須在函數「return」的末尾寫什麼?在C++
- 21. 在dojo代碼中包含javascript函數
- 22. 爲什麼我的D3選擇必須在D3代碼之前?
- 23. 必須包含必須包含GUID的NAnt +項目
- 24. 爲什麼我必須施放代表?
- 25. 爲什麼jsp中的EL函數必須聲明爲靜態?
- 26. 爲什麼我必須使用ApprovalTest將接收到的文件包含在我的源代碼管理中?
- 27. 爲什麼我爲Symfony驗證yaml文件獲取「必須包含YAML數組」?
- 28. 從C#代碼觸發PS1文件。 C#代碼必須包裝在exe
- 29. arg在ASM函數中包含什麼?
- 30. 爲什麼我必須在包含文件中重新聲明我的類?
如果沒有函數,這樣的代碼將如何執行? – 2013-03-11 05:38:59
在'main'之前還有一些方法可以在不涉及混亂的全局代碼的情況下執行代碼。 – chris 2013-03-11 05:39:14
似乎沒有那麼有用。 – 2013-03-11 05:39:56