C語(yu)言(yan)main函數(shu)必不可少,一(yi)起來了(le)解C語(yu)言(yan)main函數(shu)
時(shi)間:2018-04-27 來(lai)源:未(wei)知
C語言(yan)標準在(zai)一(yi)開始(C90標準 5.1.2條),就規定(ding)了程(cheng)序(xu)(xu)(xu)的執(zhi)行環境。對于沒有操(cao)作系統(tong)的環境來說,C程(cheng)序(xu)(xu)(xu)的入(ru)口函(han)數(shu)是什么都可以(也就是說的在(zai)單片機的C程(cheng)序(xu)(xu)(xu)里,或者(zhe)在(zai)操(cao)作系統(tong)的底層代碼的C入(ru)口處,不需要是main函(han)數(shu))。
對于有(you)操作(zuo)系(xi)統的(de)(de)環境來說(C入門者(zhe)學習C的(de)(de)環境),C程序的(de)(de)入口是main函數。而且聲明為以下兩者(zhe)之一(yi)
int main(void);
int main(int argc, char * argv[]);
對于(yu) 操作系統的(de)(de)執行環境的(de)(de)具體實(shi)現來(lai)說,鏈接(jie)器會把“你(ni)寫的(de)(de)C程序(xu)(以main開頭)”和另外的(de)(de)啟動程序(xu)相鏈接(jie),而那些啟動程序(xu)里面會引用你(ni)寫的(de)(de)main函數(shu)。這樣從(cong)程序(xu)員的(de)(de)視角來(lai)看,“C程序(xu)的(de)(de)入口”是main。
但是如果(guo)我(wo)們要指定(ding)我(wo)們的(de)(de)程序的(de)(de)入口為(wei)mymain 時,在linux下編譯直接出現undefined reference to `main'的(de)(de)錯誤(wu)

C語言沒(mei)說C程序一定(ding)要(yao)(yao)有main()函數。c的(de)編譯(yi)器工作之前(qian)先(xian)要(yao)(yao)做(zuo)cpp(比如(ru)頭文件展開)一樣,編譯(yi)完了(le)以后還要(yao)(yao)鏈接成(cheng)可(ke)執行文件。鏈接的(de)時候(hou)需要(yao)(yao)知(zhi)道程序的(de)入口是(shi)什(shen)么(me)。不(bu)管是(shi)什(shen)么(me)總歸得有的(de)名(ming)字,所(suo)以main被(bei)選中了(le)。你(ni)(ni)不(bu)喜歡這個名(ming)字,可(ke)以指定(ding)你(ni)(ni)自(zi)己的(de)入口。
參見如下文檔的 -e 或者--entry參數。
main函數就是這個約定好的(de)用戶代碼默(mo)認入口
gcc hello.c -e mymain -nostartfiles 編譯后發(fa)現我們的可(ke)執行(xing)文件a.out生成了,并且執行(xing)是,我們的hello linux也出現了
-e參數指定我(wo)們的程序的入口(kou)
-nostartfiles 連接(jie)的(de)時候不使用標準系統(tong)的(de)啟動文件(jian)


