可以在没有main()的情况下编写C程序吗?
是的,你可以編寫一個沒有main()的C程序?。
這是一個廣受好評的“Hello World”程序,沒有main()。
幾乎每本書都教我們main()是程序執(zhí)行的切入點(diǎn)。這不完全正確。從抽象層面來說,從程序員的角度來看也是如此。但是從系統(tǒng)的角度來看,_start()是第一個被調(diào)用的函數(shù)。_start()設(shè)置程序執(zhí)行的環(huán)境,然后調(diào)用main()。
這是上述程序的輸出。
編輯1:這里有一些關(guān)于為什么我寫了extern void _exit(register int)的信息;
_start()和_exit()是“系統(tǒng)”在程序執(zhí)行之前自動調(diào)用以設(shè)置環(huán)境并執(zhí)行其他一些機(jī)器級工作的函數(shù)。_exit()是預(yù)定義的,因此我們使用外部存儲類(即extern)告訴編譯器它已經(jīng)在某處聲明了。如果我們錯過了extern關(guān)鍵字,我們試圖重載在C語言中無效的函數(shù)。
_exit()在機(jī)器級工作,因此它需要具有寄存器存儲類的數(shù)據(jù)類型的輸入,因此使用了register關(guān)鍵字。如果你不編寫extern void _exit(register int),編譯器會給你一個警告,但程序運(yùn)行正常:)
編輯2:我今天收到了這條消息:
你怎么知道首先調(diào)用_start然后調(diào)用main()?
我問這個問題的唯一目的是從哪里可以獲得有關(guān)編程的這些細(xì)節(jié)?
在每本書中,我們都可以輕松找到語法和所有語言結(jié)構(gòu),但這些東西缺少某些細(xì)節(jié)。
能幫助我/指導(dǎo)我從哪里了解這些細(xì)節(jié)嗎?
實際上這是一個非常好的問題,這就是為什么我要更新我的答案,但答案很簡單,比你想象的要簡單。一切都在我們面前,我們只需要更多地關(guān)注我們通常忽略的微小細(xì)節(jié)。
因此,為了讓您知道我如何了解_start,我將使用一個示例向您展示。這是一個我編寫的簡單程序,它沒有main()。
現(xiàn)在讓我們編譯并運(yùn)行該程序,看看會發(fā)生什么。
它說在函數(shù)_start中:對main的未定義引用。這意味著_start()中沒有對main()的引用。
那是我開始了解_start的時候。然后只是谷歌的一點(diǎn)幫助我發(fā)現(xiàn)了這個函數(shù)到底是什么,它是在main()之前首先調(diào)用的函數(shù)。所以你看,我們必須停止忽略錯誤或警告,并應(yīng)該尋找它們實際意味著什么。唯一能教你學(xué)習(xí)并讓你學(xué)習(xí)的老師就是你自己:)
總結(jié)
以上是生活随笔為你收集整理的可以在没有main()的情况下编写C程序吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Linux内核分析》课程总结
- 下一篇: 如何利用循环代替递归以防止栈溢出(译)