C语言程序main入口函数
一.main()函數是什么樣的
我們先要搞清楚main()函數有哪幾種?
查閱C89/C99/C11標準文檔,里面明確固定了兩種寫法:
int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }
除此之外,其他寫法應該都是不規范的寫法,常見的有以下幾種
1、main()
直接的mian()并沒有返回值,沒有入參。這種寫法實際來說,部分編譯器會顯示警告,并且會返回默認值為int。不過在C89標準中其實是可以的,由于沒有聲明返回類型,所以才會返回默認值int。
2、void main()
初學者經常會使用的形式,但是并不知道來源在哪。這種寫法的返回值是void,沒有參數。值得注意的是,一旦聲明是void,在程序退出后,想要獲取其退出狀態也就不可以了。
3、int main(void)
比較常見的寫法,這種寫法的形參為void,表明它在調用的時候不能傳入任何參數,那么它也就不能獲取命令行參數了。
4、int main ()
和上面第3種看起來好像沒啥區別,但是還是有些許不同。main函數雖然聲明為無入參,但調用時卻是可以傳入任何參數或不傳參數的。
5、int main(int argc,char *argv[])
int argc入參為命令行參數個數,char *argv[]入參為命令行參數數組。這種寫法也比較常見的,主要用在需要從命令行獲取參數的功能。
6、int main(int argc,char *argv[],char *envp[])
包含三個參數的一種寫法,上面第5種的升級版,int argc是命令行參數個數,char *argv[]是命令參數數組,char *envp[]是環境變量數組。雖然只比第六種多了一個參數,但全局變量environ可以代替envp的作用,獲取或者設置環境變量可以使用getenv或putenv,因此也沒有必要使用該形式。這種寫法多源于編譯器的擴展。
寫法多樣有些算是歷史遺留有些算是編譯器的擴展,還有些不知道從哪里生出來的。為了代碼的通用可移植性,建議采用C89/C99/C11標準文檔中規定的這兩種寫法。
二.誰在調用main()函數,是否必須有main()函數
1、編譯鏈接時的引導代碼。操作系統的應用程序其實在mian執行前也需要運行一段引導代碼才可以執行main,我們寫應用程序的時候不需要考慮引導代碼。編譯鏈接時(準確說是鏈接)由鏈接器中事先準備好的引導代碼給鏈接進去和我們寫的應用程序一起構成最終的可執行程序。
2、運行時的加載器。加載器是操作系統中的程序,當我們去執行一個程序時,加載器負責將這個程序加載到內存中去執行這個程序。
3、程序在編譯鏈接時使用鏈接器,運行時使用加載器,這兩個東西對程序運行原理非常重要。
上面一段解釋,相信大家已經明白了,是否叫main()函數取決于我們編譯特別是鏈接時指定的入口函數,如何調用完全由操作系統。很簡單的一個道理,比如我事先寫好了調用“usrapp”函數,那么你在寫函數體的時候名字就必須叫usrapp,而我如果改成叫"usrapp1"的函數,你在寫函數體的時候就必須寫成“usrapp1”,同樣的道理,操作系統在某種情況下找main函數,此時你就應該寫"main"的函數名,如果操作系統在其他的情況下找“WinMain”或者“WinMain2”的時候,你自然就應該把入口函數寫成“WinMain”或者“WinMain2”了。那么這里寫成"main"不行,寫成“WinMain”卻可以,就不難理解了。
所以說必須有main函數只是針對windows操作系統而已,其他操作系統是允許我們在鏈接時,修改鏈接選項,制定我們程序的入口函數,此時入口函數就可以任由我們發揮了,只需要符合變量命名規則即可,雖然是這樣,但是在整個工程中,還是必須只能有一個入口函數,只是名字換了而已。
聲明:
本文于網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的C语言程序main入口函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 投资者能开立多个账户吗?
- 下一篇: 市盈率负100多是什么意思