簡體   English   中英

c中有關“ main”函數的信息存儲在哪里,main在哪里定義?

[英]where is the information about the “main” function stored in c, where the main defined?

在c中定義了main函數的位置,是在編譯器中還是在頭文件中定義的,編譯器如何知道“ main”一詞的含義? 我無法在任何地方得到答案,請請幫助。

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

兩者均未定義。 main實際上不是C中的關鍵字-它只是一個常規函數。

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

然后,鏈接器將該函數的位置放在目標文件中作為入口點。

您可以在此處看到glibc的入口點: http : //fossies.org/dox/glibc-2.15/dl-init_8c_source.html

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

編譯器生成應用程序時,代碼包含兩個主要部分:

  1. 操作系統膠水代碼
  2. 程序員編寫的應用程序(包括main)

生成的應用程序在運行時執行OS粘合代碼,然后調用函數main。 因此,當編譯器為應用程序生成代碼時,如果找不到函數main,則它將無法編譯。 如果找到它,那么它將知道其地址,從而知道如何調用它。

main沒什么特別的(除了編譯器會尋找它)。

Call stack存儲計算機程序的活動子例程的信息。由於Main()函數已由編譯器定義。因此,應將其存儲在類似於調用堆棧的數據結構中。請查看此鏈接http:// en。 wikipedia.org/wiki/Call_stack希望能有所幫助。

C允許兩種不同類型的執行環境: FreestandingHosted 請參閱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)的系統上運行的有約束力的合同。 因此,供應商有責任允許自舉代碼尋找該特定功能,而程序員有責任提供適當的定義。

在c中定義的主要功能是在編譯器還是在頭文件中定義

(免責聲明:Windows着色說明)

函數main是C標准的一部分,通常是程序的起點,不需要特殊的頭文件。 名稱“ main”對於操作系統而言實際上並不重要,而是默認情況下鏈接程序會將main設置為程序的起點,但實際上該名稱可以是程序中的任何其他函數。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM