我們知道在 C 語(yǔ)言中,程序是從 main 函數(shù)開(kāi)始運(yùn)行的,我們稱(chēng)其為主函數(shù)。我們來(lái)看看下面幾種 main 函數(shù)定義正確嗎?
公司主營(yíng)業(yè)務(wù):網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。創(chuàng)新互聯(lián)建站推出興山免費(fèi)做網(wǎng)站回饋大家。那么 main 函數(shù)的原型到底是什么呢?我們來(lái)看看編譯器怎么說(shuō),我們分別編譯下四種 main
函數(shù)的形式,經(jīng)過(guò)編譯后,程序可以編譯通過(guò)并且執(zhí)行完成。那么最標(biāo)準(zhǔn)的 main 函數(shù)的原型是上面的第四種,main 函數(shù)是操作系統(tǒng)調(diào)用的函數(shù),操作系統(tǒng)總是將 main 函數(shù)作為應(yīng)用程序的開(kāi)始并且將 main 函數(shù)的返回值作為應(yīng)用程序的退出狀態(tài)。那么 C 編譯器為什么要支持這么多不同的 main 函數(shù)原型呢?我們來(lái)做個(gè)實(shí)驗(yàn),代碼如下
#includeint main() { printf("hello\n"); return 99; }
我們?cè)?BCC 編譯器下編譯看看,結(jié)果肯定是打印 hello 了。但是我們返回的是 99,我們順便打印下環(huán)境變量的值,看看有什么玄機(jī)
我們看到打印的環(huán)境變量的值為 99。如果我們將上面程序中的 return 后面改成 0。再來(lái)編譯看下環(huán)境變量的值是多少
我們看到環(huán)境變量的值變成 0 了。那么 main 函數(shù)的返回值是將它返回到系統(tǒng)中并保存下來(lái)。那么回到我們之前所說(shuō)的問(wèn)題,在以前的程序中,好多中編程寫(xiě)法。我們?yōu)榱思嫒菀郧八械某绦?,編譯器就必須得支持所有的 main 函數(shù)的寫(xiě)法。那么程序執(zhí)行時(shí)可以向 main 函數(shù)傳遞參數(shù),格式:int main(int argc, char *argv[], char *env[])。a> argc - 命令行參數(shù)個(gè)數(shù);b> argv - 命令行參數(shù)數(shù)組;c> env - 環(huán)境變量數(shù)組;我們平時(shí)見(jiàn)到的大多數(shù)是帶前兩種的 main 函數(shù)的寫(xiě)法。
那么在gcc編譯器中,常見(jiàn)用法如下:
我們下來(lái)看個(gè)示例代碼,代碼如下
#intcludeint main(int argc, char* argv[], char* env[]) { int i = 0; printf("============== Begin argv ==============\n"); for(i=0; i 我們來(lái)看看編譯效果
我們可以看到打印出了 ./a.out。也就是說(shuō)打印出了除過(guò) gcc 以外的命令行參數(shù),我們?cè)僖韵旅孢@種方式來(lái)打印呢
那么我們可以看到打印出了除 gcc 以外的所有參數(shù)。講到最后,我們?cè)賮?lái)討論個(gè)有意思的問(wèn)題:main 函數(shù)一定是程序執(zhí)行的第一個(gè)函數(shù)嗎?咋一聽(tīng),就是啊,我們平時(shí)書(shū)上所見(jiàn)到的,還有老師說(shuō)的都是這樣的哈。那么我們來(lái)做個(gè)實(shí)驗(yàn),代碼如下
#include#ifndef __GNUC__ #define __attribute__(x) #endif __attribute__((constructor)) void before_main() { printf("%s\n",__FUNCTION__); } __attribute__((destructor)) void after_main() { printf("%s\n",__FUNCTION__); } int main() { printf("%s\n",__FUNCTION__); return 0; } 我們看到如果是 GUNC 編譯器的話(huà),便定義 __attribute__ 宏。通過(guò)這個(gè)宏,我們分別聲明了兩個(gè)函數(shù),我們來(lái)看看編譯結(jié)果
我們看到竟然在 main 函數(shù)的前后分別執(zhí)行了這兩個(gè)函數(shù)。感覺(jué)很神奇,那么這個(gè) __attribute__ 宏便是我們 gcc 編譯器所特有的屬性關(guān)鍵字。使用就可以在 main 函數(shù)的執(zhí)行前后再去執(zhí)行別的函數(shù)。我們?cè)賮?lái)看看在 BCC 編譯器中,它還支持嗎
我們看到它不支持那個(gè) __FUNCTION__ ,我們便將他換成對(duì)應(yīng)的字符串。編譯后的結(jié)果是只打印了 main,也就是說(shuō)它在 main 函數(shù)前后并沒(méi)有去執(zhí)行那兩個(gè)函數(shù)。所以這個(gè)特性也是編譯器特有支持的,但起碼說(shuō)明了在現(xiàn)代編譯器中支持在 main 函數(shù)前調(diào)用其他函數(shù)。
歡迎大家一起來(lái)學(xué)習(xí) C 語(yǔ)言,可以加我QQ:243343083。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
分享標(biāo)題:C之main函數(shù)和命令行參數(shù)(三十)-創(chuàng)新互聯(lián)
文章地址:http://weahome.cn/article/diiiie.html