我們知道在 C 語言中,程序是從 main 函數(shù)開始運(yùn)行的,我們稱其為主函數(shù)。我們來看看下面幾種 main 函數(shù)定義正確嗎?


那么 main 函數(shù)的原型到底是什么呢?我們來看看編譯器怎么說,我們分別編譯下四種 main
函數(shù)的形式,經(jīng)過編譯后,程序可以編譯通過并且執(zhí)行完成。那么最標(biāo)準(zhǔn)的 main 函數(shù)的原型是上面的第四種,main 函數(shù)是操作系統(tǒng)調(diào)用的函數(shù),操作系統(tǒng)總是將 main 函數(shù)作為應(yīng)用程序的開始并且將 main 函數(shù)的返回值作為應(yīng)用程序的退出狀態(tài)。那么 C 編譯器為什么要支持這么多不同的 main 函數(shù)原型呢?我們來做個(gè)實(shí)驗(yàn),代碼如下
#include <stdio.h>
int main()
{
printf("hello\n");
return 99;
}我們在 BCC 編譯器下編譯看看,結(jié)果肯定是打印 hello 了。但是我們返回的是 99,我們順便打印下環(huán)境變量的值,看看有什么玄機(jī)

我們看到打印的環(huán)境變量的值為 99。如果我們將上面程序中的 return 后面改成 0。再來編譯看下環(huán)境變量的值是多少

我們看到環(huán)境變量的值變成 0 了。那么 main 函數(shù)的返回值是將它返回到系統(tǒng)中并保存下來。那么回到我們之前所說的問題,在以前的程序中,好多中編程寫法。我們?yōu)榱思嫒菀郧八械某绦颍幾g器就必須得支持所有的 main 函數(shù)的寫法。那么程序執(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í)見到的大多數(shù)是帶前兩種的 main 函數(shù)的寫法。
那么在gcc編譯器中,常見用法如下:

我們下來看個(gè)示例代碼,代碼如下
#intclude <stdio.h>
int main(int argc, char* argv[], char* env[])
{
int i = 0;
printf("============== Begin argv ==============\n");
for(i=0; i<argc; i++)
{
printf("%s\n", argv[i]);
}
printf("============== End argv ==============\n");
return 0;
}我們來看看編譯效果

我們可以看到打印出了 ./a.out。也就是說打印出了除過 gcc 以外的命令行參數(shù),我們再以下面這種方式來打印呢

那么我們可以看到打印出了除 gcc 以外的所有參數(shù)。講到最后,我們再來討論個(gè)有意思的問題:main 函數(shù)一定是程序執(zhí)行的第一個(gè)函數(shù)嗎?咋一聽,就是啊,我們平時(shí)書上所見到的,還有老師說的都是這樣的哈。那么我們來做個(gè)實(shí)驗(yàn),代碼如下
#include <stdio.h>
#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 編譯器的話,便定義 __attribute__ 宏。通過這個(gè)宏,我們分別聲明了兩個(gè)函數(shù),我們來看看編譯結(jié)果

我們看到竟然在 main 函數(shù)的前后分別執(zhí)行了這兩個(gè)函數(shù)。感覺很神奇,那么這個(gè) __attribute__ 宏便是我們 gcc 編譯器所特有的屬性關(guān)鍵字。使用就可以在 main 函數(shù)的執(zhí)行前后再去執(zhí)行別的函數(shù)。我們再來看看在 BCC 編譯器中,它還支持嗎

我們看到它不支持那個(gè) __FUNCTION__ ,我們便將他換成對應(yīng)的字符串。編譯后的結(jié)果是只打印了 main,也就是說它在 main 函數(shù)前后并沒有去執(zhí)行那兩個(gè)函數(shù)。所以這個(gè)特性也是編譯器特有支持的,但起碼說明了在現(xiàn)代編譯器中支持在 main 函數(shù)前調(diào)用其他函數(shù)。
歡迎大家一起來學(xué)習(xí) C 語言,可以加我QQ:243343083。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
當(dāng)前標(biāo)題:C之main函數(shù)和命令行參數(shù)(三十)-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://chinadenli.net/article4/diiiie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、云服務(wù)器、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站制作、定制開發(fā)、網(wǎng)頁設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容