- 論壇徽章:
- 0
|
本帖最后由 sampher 于 2013-11-21 08:59 編輯
下面這樣的代碼把main聲明為void返回類型,在VC下是能編譯通過(guò)的,在GCC下編譯會(huì)提示main必須有返回值。我想知道C/C++標(biāo)準(zhǔn)對(duì)此有規(guī)定嗎? 還是不同時(shí)期,不同版本的C/C++標(biāo)準(zhǔn),對(duì)此的規(guī)定都不同? 抑或是編譯器廠商自己決定的,main()的形式不在標(biāo)準(zhǔn)之內(nèi)?
5L版主給的回復(fù)應(yīng)該是最佳答案!
----------------------------------------------------------------------------------
main函數(shù)的返回值就是運(yùn)行其程序的這個(gè)進(jìn)程的狀態(tài)碼,命令行程序常常通過(guò)判斷相應(yīng)命令(進(jìn)程)的狀態(tài)碼來(lái)判斷相應(yīng)命令是結(jié)果是否正常,VC++是允許void main這種形式的程序入口原型的,之所以允許這么做是有歷史原因的,在最初的K&R C中main函數(shù)的原型為:main(),沒(méi)有對(duì)返回值和參數(shù)做出明確規(guī)定,為此存在不同main函數(shù)原型擴(kuò)展。K&R C第二版開始對(duì)此做出了更細(xì)致的規(guī)定,除了main()這樣的原型以外又加入了帶參數(shù)的原型:main(int argc, char *argv[]),又由于K&R C中允許Implicit declarations(未經(jīng)聲明而直接使用的將視為int類型,函數(shù)返回值也視為int)。main函數(shù)原型真正的定型是從C89(第一版ANSI C標(biāo)準(zhǔn))開始的,此標(biāo)準(zhǔn)明確了int main(void)和int main(int argc, char *argv[])這兩個(gè)原型,其它的原型是不允許的,考慮到對(duì)舊代碼的兼容問(wèn)題,許多編譯器也允許K&R C中的原型,不帶返回值類型的main視為void或int處理(由編譯器決定)。從此以后main逐漸的定型下來(lái),但部分編譯器依然存在不同的擴(kuò)展,比如說(shuō)帶有環(huán)境變量參數(shù)envp的擴(kuò)展?偠灾,使用main最好嚴(yán)格按照標(biāo)準(zhǔn)來(lái),否則代碼不能保證可移植性。
總之:標(biāo)準(zhǔn)C/C++都對(duì)返回值有要求,沒(méi)標(biāo)準(zhǔn)化之前的沒(méi)要求,很多編譯器為了兼容老代碼才允許了返回值原型為void的形式。 |
|