2012-06-19 14 views
0

其中c是定義的主函數,是在編譯器還是頭文件中定義的,編譯器如何知道「主」字的含義?我無法在任何地方得到答案,請請幫助。其中是存儲在c中的「main」函數的信息,其中主要定義的是?

+0

這將在編譯器核心硬編碼,是的。但你打算做什麼?創建一個編譯器的分支,允許您爲程序的主入口點使用其他名稱? –

+2

@MrLister:不是真正的硬編碼......另外,這樣做有非常合理的用途,例如,如果您正在編譯內核。 – cha0site

回答

0

功能main的含義是語言規範的一部分。
編譯器有特殊的代碼來處理它。

1

通常,操作系統定義了一個入口點(在Unix上,它通常是start函數),它由操作系統(特別是加載程序)自動調用。您的C編譯器提供了一個最小化的運行時設置(同樣,在Unix上,它很可能被稱爲crt0.o),它是一個預編譯的目標文件,用於設置C庫內部,然後調用main()函數。所以編譯器與它無關;它是crt0.o和完成這項工作的操作系統。

0

當存在兩個主要部分的代碼copiler生成應用:

  1. 操作系統膠水代碼
  2. 被寫入由程序員的應用(包括主)

生成的應用程序在運行時執行操作系統膠水代碼,然後調用main函數。因此,當編譯器爲應用程序生成代碼時,如果找不到該函數,main將無法編譯。如果它發現它,那麼它知道它的地址,從而知道如何調用它。

除了編譯器查找它之外,沒有什麼特別的關於main的特別之處。

1

它既沒有定義也沒有。 main實際上並不是C中的關鍵字 - 它只是一個常規函數。

標準C庫包含一個函數,該函數設置初始環境(收集argc,argv等)並調用您的main函數。

然後鏈接器將該函數的位置放入目標文件中作爲入口點。

你可以看到glibc的入口點這裏: http://fossies.org/dox/glibc-2.15/dl-init_8c_source.html

0

Call stack存儲計算機program.Since的積極子程序的信息,main()函數已經被定義compiler.So,應貯存在數據結構類似於調用stack.please看看這個鏈接 http://en.wikipedia.org/wiki/Call_stack 希望這會有所幫助。

1

C允許兩種不同類型的執行環境:獨立式託管。請參閱 5.1.2/1:

定義了兩種執行環境:獨立式和託管式。在這兩種情況下,當執行 環境調用指定的C函數時, 程序啓動發生。

然而:

方式和這種初始化的定時是 其他未指定。程序終止將控制返回到執行 環境。

在獨立環境中(認爲嵌入式系統),按照5.1.2.1/1:

在獨立環境中(其中,C程序執行可發生而無需操作任何 益處系統)中,程序 啓動時調用的函數的名稱和類型是實現定義的。

大多數(桌面)共同系統屬於託管類別即一個其中有一個主機或OS其提供了程序運行的上下文。在這種環境下(見5.1.2.2.1/1):

程序啓動時調用的函數名爲main。

main不是關鍵字(即不在6.4.1定義的集合中)。把它看作是C程序運行的有約束力的契約,並且從具有主機(OS)的系統運行。因此,供應商有責任允許引導代碼尋找這個特定的功能,並且程序員有責任提供合適的定義。

0

在c定義的主要功能,其中,是它在編譯程序或 在頭文件中定義

(聲明:視窗有色描述)

功能main是C的一部分標準,通常是程序的起點,不需要特殊的標題。名稱「main」對操作系統來說並不重要,相反,鏈接器默認將main設置爲程序的起始點,但名稱實際上可以是程序中的任何其他函數。

鏈接器可以選擇在程序中指定另一個入口點,它只是程序開始執行的起點,但是它是否被稱爲main,_tmain或WinMain無關緊要 - 從操作系統。

相關問題