main函數(shù)的標(biāo)準(zhǔn)定義
學(xué)過(guò)C語(yǔ)言的人都知道,main函數(shù)是程序啟動(dòng)的入口函數(shù),每一個(gè)C語(yǔ)言程序里有一個(gè)main函數(shù),在程序里它是唯獨(dú)一個(gè)不能被其他函數(shù)調(diào)用的特殊函數(shù)。在眾多的單片機(jī)C語(yǔ)言編譯器里對(duì)main函數(shù)的寫(xiě)法都沒(méi)有明確的要求,寫(xiě)法非常自由,可以寫(xiě)成帶形參的函數(shù),也可以寫(xiě)成無(wú)形參的函數(shù),還可以寫(xiě)成返回值為任意數(shù)據(jù)類(lèi)型的函數(shù)。通用的寫(xiě)法都是:void main () {…}。而根據(jù)C99標(biāo)準(zhǔn)的要求,main函數(shù)是一個(gè)有返回值的函數(shù),而且返回值類(lèi)型必須為int。下面這段英文描述是從C99標(biāo)準(zhǔn)的PDF文檔上復(fù)制下來(lái)的:
5.1.2.2.1 Program startup
The called at program startup is named main.The implementation declares no
prototype for this .It shall be defined with a return type of int and with no
parameters:
int main(void) { /* ... */ }
or with twoparameters (referred to here as argc and argv,though anynames may be
used, as theyare local to the in which theyare declared):
int main(int argc, char *argv[]) { /* ... */ }
or equivalent;9)or in some other implementation-defined manner.
從C99標(biāo)準(zhǔn)的規(guī)定里可以看出,main函數(shù)的標(biāo)準(zhǔn)定義一般為這兩種形式:
第一種形式:
int main (void)
{
……
return 0;
}
第二種形式:
int main (int argc, char *argv[ ])
{
……
return 0;
}
第一種定義main函數(shù)不帶形參,寫(xiě)起來(lái)比較簡(jiǎn)便。編寫(xiě)單片機(jī)C語(yǔ)言程序是不需要通過(guò)操縱系統(tǒng)向main函數(shù)傳遞參數(shù)的,所以筆者推薦采用第一種標(biāo)準(zhǔn)定義。
標(biāo)準(zhǔn)的意義在于通用,對(duì)C語(yǔ)言來(lái)講,符合標(biāo)準(zhǔn)意味著代碼的可移植好。如果main函數(shù)不符合C99標(biāo)準(zhǔn)也沒(méi)關(guān)系,只要編譯器支持,對(duì)您的程序沒(méi)有任何影響。到目前為止,沒(méi)有哪個(gè)C編譯器完全遵循C99標(biāo)準(zhǔn),這都是為了讓編譯器兼容以前的代碼,這也是為什么C標(biāo)準(zhǔn)十幾年才修改一次的原因。當(dāng)然,這并不代表新標(biāo)準(zhǔn)形同虛設(shè),從發(fā)展趨勢(shì)來(lái)看,C編譯器都會(huì)逐漸向新標(biāo)準(zhǔn)靠攏。
既然有了標(biāo)準(zhǔn)我們就應(yīng)該遵循。我們可以用權(quán)威標(biāo)準(zhǔn)來(lái)衡量一個(gè)代碼的優(yōu)劣,去批判“另類(lèi)”代碼,寫(xiě)出標(biāo)準(zhǔn)的C代碼,提高代碼的可移植性。