main() / void main() / int main() / int main(void) / int main(int argc, char *argv[])的區別

原文:http://blog.chinaunix.net/uid-26750075-id-3123827.html

近期學習時對這個問題產生了迷惑,看到了這篇文章,感覺挺好

http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1044841143&id=1043284376

   在C/C++的學習過程中,一個很常見的問題就是void main和int main有什麼區別呢?本文試圖回答該問題,並涉及一些相關問題,包括一些main函數的其他實現。

  首要說明的一點是這些(主題)可能是人們看起來會爲之爭辯幾小時甚至好幾天的問題。有些論據是有根據的,有些不是,而有些只是普通而過時的觀點。C標準和C++標準在main函數上是有區別的,所以我分別詳細來介紹他們。separately.

對於C語言:

  C89標準的main()函數是可接受的,儘管現在建議是使用C99的標準。C99標準只定義瞭如下兩種可接受的函數原型:

int main ( void )
int main ( int argc, char *argv[] )

  以上函數原型微小的變形也是可以被接受的,比如int可以被typedef定義爲int的名字所代替,argv的類型也可以寫成char **argv,等等。

第一種函數原型選擇適用你不許要訪問命令行參數的時候。

對於第二種函數原型選擇,如果你喜歡的話,標識符argc和argv的名字可以改變,但是堅持使用argc/argv是一個慣例。

main()函數的返回值必須是一個int型,返回值給main()函數的調用者傳遞一個int類型的狀態。

在C89標準下,main()函數中的return語句是必須的;然而在C99標準下,如果沒有寫return語句,默認(隱含的)會return 0。


對於C++語言:

可以被接受的使用方式有:

int main ( int argc, char *argv[] )
int main ()

第一種遵循被C99中使用的慣例。

第二種適用於不需要訪問命令行參數的環境,相當於C99中的int main(void)。

return必須返回一個int型數值,默認返回0(但是標準中並沒有要求)。




int main() 和int main(void)的區別

C程序員通常誤認爲下面的函數原型是不要參數的:

int foo();

事實上,這個函數是被認爲需要不確定個數的參數。告訴編譯器函數爲不帶參數的正確做法是:在括號中使用void 關鍵字。

void main()的細節(機理):

C和C++中正常的函數調用和返回,假如你不想從一個函數中返回任何東西,你可以定義函數的返回值類型爲void。例如,一個函數不帶參數,無返回值的函數原型可以定義爲:

void foo(void);

一個正常的誤解是這樣的邏輯也被應用於main函數。是的,它不可以,main函數是特殊的,你應該遵循標準並定義函數的返回值爲int。但是在一些特殊的系統中是可以的。如果你不確定你正在使用的是否是特殊系統之一的話,那答案就是“不是”。如果是特殊系統的話,你應該已經知道了。

提醒你如果你在論壇上髮帶有"void main"的代碼,會有人來告訴你要你糾正它。如果你回覆說“我的老師說這樣是可以的”也無用。老師們有錯誤的習慣。安全期見,在論壇上只貼標準的代碼,然後你會發現人們集中在回答你的問題,而不是在告訴你函數原型的事情上浪費時間。a

但是int main(int argc, char *argv[], char *envp[])是怎麼回事呢?

作爲對標準的擴展,在一些系統中一個附加的main函數參數可以被用來獲得並訪問環境變量。這並不保證在所有的編譯器上都能正常工作,如果你想讓你的代碼可移植,那麼請慎重使用它。

最後,這個網頁告訴我們一些關於爲什麼void main函數是不好的用法的背景知識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章