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