C語言本質 main函式和啟動例程

2021-06-18 20:32:36 字數 1155 閱讀 4728

2012-06-26 00:12:57

|  分類:

linux|字型大小

訂閱 以前我們常用gcc main.c -o main命令編譯乙個程式,其實也可以分三步做,第一步生成彙編**,第二步生成目標檔案,第三步生成可執行檔案:

$ gcc

-s main.c

$ gcc

-c main.s

$ gcc main

.o

由此可見,如果我們用gcc做鏈結,gcc其實是呼叫ld將目標檔案crt1.o和我們的hello.o鏈結在一起。crt1.o裡面已經提供了_start入口點,我們的匯程式設計序中再實現乙個_start就是多重定義了,鏈結器不知道該用哪個,只好報錯。另外,crt1.o提供的_start需要呼叫main函式,而我們的匯程式設計序中沒有實現main函式,所以報錯。

如果目標檔案是由c**編譯生成的,用gcc做鏈結就沒錯了,整個程式的入口點是crt1.o中提供的_start,它首先做一些初始化工作(以下稱為啟動例程,startup routine

),然後呼叫c**中提供的main函式。所以,以前我們說main函式是程式的入口點其實不準確,_start才是真正的入口點,而main函式是被_start呼叫的。

main函式最標準的原型應該是int main(int argc, char *argv),也就是說啟動例程會傳兩個引數給main函式,這兩個引數的含義我們學了指標以後再解釋。我們到目前為止都把main函式的原型寫成int main(void),這也是c標準允許的,如果你認真分析了上一節的習題,你就應該知道,多傳了引數而不用是沒有問題的,少傳了引數卻用了則會出問題。

C語言main函式

c語言中main函式是可以帶引數的,平時寫倒是沒怎麼用這個引數,學習了一下這個引數。c語言規定了main函式只能有兩個引數,並且其型別也規定了,習慣上把他們寫成 main int argc char argv 第乙個引數是整形,第二個引數是指向字串的指標陣列,為什麼這麼定義?有什麼用?c語言還規定了...

C語言main 函式詳解

c的設計原則是把函式作為程式的構成模組。main 函式稱之為主函式,乙個c程式總是從main 函式開始執行的。在最新的 c99 標準中,只有以下兩種定義方式是正確的 int main void 無引數形式 int main int argc,char argv 帶引數形式 int指明了main 函式...

C語言main 函式詳解

c的設計原則是把函式作為程式的構成模組。main 函式稱之為主函式,乙個c程式總是從main 函式開始執行的。在最新的 c99 標準中,只有以下兩種定義方式是正確的 int main void 無引數形式 int main int argc,char argv 帶引數形式 int指明了main 函式...