很多同學在初學C或者C++時,都見過各種各樣的main函數表示法:
看過這麼多寫法之後,不禁頓生疑惑,到底哪個才是main函數的標准寫法?
先看C語言標准文檔裡對main函數的描述:
再看C++標准文檔裡對main函數的描述:
附:標准文檔下載跳轉鏈接——C語言標准
——C++標准
至此,可以看到,在C語言中,標准寫法是int main(void)和int main(int argc, char *argv[]),在C++中,標准寫法是int main()和int main(int argc, char *argv[])。
那麼寫成main()或者void main()到底行不行?答案是不一定行。在舊的編譯器上,這樣寫也能通過,但主要是為了兼容C/C++標准未出來之前的歷史代碼。在較新的編譯器上,這樣寫都會得到一個警告信息,或者,干脆就是錯誤信息,無法通過編譯。所以,為了代碼的規范性,通用性,請堅持按標准文檔裡推薦的寫法來寫。尤其是初學者,按標准來寫是一種很好的習慣,而編程中的好習慣甚至比編程本身還重要!
還有人疑惑main函數第二個參數到底是char *argv[]還是char **argv?答案是都行,argv首先是一個數組,其數組元素的類型是字符指針,每一個字符指針都指向一個特定的字符串,如下圖:
此外,也許還有人對main函數的參數名稱有疑問,既然main函數也是個函數,那麼它的參數名稱argc、argv可以替換成其它合法的標識符嗎?這個答案也是肯定的,如果心血來潮,寫成int main(int a, char *b[])這種形式也是被允許的,但是仍然建議按argc、argv寫,避免不必要的疑惑。
簡單地說,為了與系統環境通信,這裡裡系統不一定就是操作系統,也可以是其他調用的它的上層環境。
main函數是系統執行程序的入口,可以將main函數看做是供系統調用的。既然系統可以調用main函數,那麼系統就有為main函數傳遞指令(參數)的需求,同時,main函數也有為系統環境返回信號的義務。這樣一來,參數充當入口,return充當出口,使得main函數的功能更加完善。
既然main函數可以有參數,那麼就一定可以獲取它的參數值,只要為它傳入指定的實參,就可以在main函數中把它打印出來。
先寫一段打印參數的代碼,命名為text.c,編譯,默認結果顯示argv[0]存儲函數名稱及其路徑,而argv[argc]為空指針:
打開cmd命令窗口,切換至程序所在目錄,為本程序傳入參數:
顯然,打印出的參數內容與我們的預期一致。
同理,main函數既然為系統返回了信號,那麼系統也一定可以獲取到它。重寫編寫源文件,這次我們把無關部分全部略去,只剩返回值。
先編譯,然後打開cmd窗口切換至當前程序目錄下,輸入text.exe,回車後,再輸入echo %errorlevel%,然後就可以看到打印出的返回值了:
除了這種方法,也可以用main函數調用main函數本身來打印它的返回值,但是這樣做就相當於讓main函數進入了遞歸調用當中,必須設定恰當的終止條件,否則程序將陷入無限遞歸,進而崩潰。
由此可以看出,main函數除了可以與系統通信外,與普通函數還是很一致的,說到底,它也只是個函數麼。
編程中,一些語法是標准所強制要求的,另一些語法標准裡並未強制要求,而是建議,或者連建議都沒,只是由編譯器的實現而定。這時候,就要盡量按標准裡強制的或者建議的語法去書寫程序,這樣做可以極大地保證程序的健壯性。