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