[英]where are the variable stored that are initialized in main function in c?
[英]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庫包含一個函數,該函數設置初始環境(收集argc
, argv
等)並調用您的main
函數。
然后,鏈接器將該函數的位置放在目標文件中作為入口點。
您可以在此處看到glibc
的入口點: http : //fossies.org/dox/glibc-2.15/dl-init_8c_source.html
main
功能的含義是語言規范的一部分。
編譯器具有特殊的代碼來處理它。
編譯器生成應用程序時,代碼包含兩個主要部分:
生成的應用程序在運行時執行OS粘合代碼,然后調用函數main。 因此,當編譯器為應用程序生成代碼時,如果找不到函數main,則它將無法編譯。 如果找到它,那么它將知道其地址,從而知道如何調用它。
main沒什么特別的(除了編譯器會尋找它)。
Call stack
存儲計算機程序的活動子例程的信息。由於Main()函數已由編譯器定義。因此,應將其存儲在類似於調用堆棧的數據結構中。請查看此鏈接http:// en。 wikipedia.org/wiki/Call_stack希望能有所幫助。
C允許兩種不同類型的執行環境: Freestanding和Hosted 。 請參閱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.