您好,登錄后才能下訂單哦!
我們知道在 C 語言中,程序是從 main 函數(shù)開始運行的,我們稱其為主函數(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ù)原型呢?我們來做個實驗,代碼如下
#include <stdio.h> int main() { printf("hello\n"); return 99; }
我們在 BCC 編譯器下編譯看看,結(jié)果肯定是打印 hello 了。但是我們返回的是 99,我們順便打印下環(huán)境變量的值,看看有什么玄機
我們看到打印的環(huán)境變量的值為 99。如果我們將上面程序中的 return 后面改成 0。再來編譯看下環(huán)境變量的值是多少
我們看到環(huán)境變量的值變成 0 了。那么 main 函數(shù)的返回值是將它返回到系統(tǒng)中并保存下來。那么回到我們之前所說的問題,在以前的程序中,好多中編程寫法。我們?yōu)榱思嫒菀郧八械某绦?,編譯器就必須得支持所有的 main 函數(shù)的寫法。那么程序執(zhí)行時可以向 main 函數(shù)傳遞參數(shù),格式:int main(int argc, char *argv[], char *env[])。a> argc - 命令行參數(shù)個數(shù);b> argv - 命令行參數(shù)數(shù)組;c> env - 環(huán)境變量數(shù)組;我們平時見到的大多數(shù)是帶前兩種的 main 函數(shù)的寫法。
那么在gcc編譯器中,常見用法如下:
我們下來看個示例代碼,代碼如下
#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ù)。講到最后,我們再來討論個有意思的問題:main 函數(shù)一定是程序執(zhí)行的第一個函數(shù)嗎?咋一聽,就是啊,我們平時書上所見到的,還有老師說的都是這樣的哈。那么我們來做個實驗,代碼如下
#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__ 宏。通過這個宏,我們分別聲明了兩個函數(shù),我們來看看編譯結(jié)果
我們看到竟然在 main 函數(shù)的前后分別執(zhí)行了這兩個函數(shù)。感覺很神奇,那么這個 __attribute__ 宏便是我們 gcc 編譯器所特有的屬性關(guān)鍵字。使用就可以在 main 函數(shù)的執(zhí)行前后再去執(zhí)行別的函數(shù)。我們再來看看在 BCC 編譯器中,它還支持嗎
我們看到它不支持那個 __FUNCTION__ ,我們便將他換成對應(yīng)的字符串。編譯后的結(jié)果是只打印了 main,也就是說它在 main 函數(shù)前后并沒有去執(zhí)行那兩個函數(shù)。所以這個特性也是編譯器特有支持的,但起碼說明了在現(xiàn)代編譯器中支持在 main 函數(shù)前調(diào)用其他函數(shù)。
歡迎大家一起來學(xué)習(xí) C 語言,可以加我QQ:243343083。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。