2012-01-01 33 views
1

可能重複:
What is the proper declaration of main?樣式用C

我的工作我的C技能,我已經注意到,

INT主(INT ARGC ,char * argv [])

回報(EXIT_SUCCESS)

,而不是

INT主要(),並返回0

這是爲什麼?

+0

雖然這裏有兩個問題。 – 2012-01-01 06:48:07

+0

@ChristianJonassen:常見問題也討論從main()返回。 – 2012-01-01 06:48:50

+0

你說得對。這個問題是重複的。 – 2012-01-01 06:54:29

回答

9

如果你要忽略參數列表,它是合理的,合理的使用方法:

int main(void) { ... } 

的標準保佑這個用法,還有一個帶參數。如果您編譯爲-Wstrict-prototypes並且不包含void,那麼您會收到GCC的警告,因此我編寫void。這裏的C++不同。

至於return EXIT_SUCCESS;,一般來說似乎沒什麼好處;我繼續在main()函數的末尾寫上return 0;,即使C99允許您在那裏省略任何返回(然後它的行爲就像您寫下return 0;一樣)。

ISO/IEC 9899:1999

§5.1.2.2.1程序啓動

¶1稱爲在程序啓動的功能被命名爲main。該實現聲明不具有此功能的原型 。它應具有的int返回類型並沒有 參數來定義:

int main(void) { /* ... */ } 

或兩個參數(這裏稱爲argcargv,雖然任何名稱可能是 使用,因爲它們是本地的在其中聲明它們的功能):

int main(int argc, char *argv[]) { /* ... */ } 

或等同物; 9)或以某種其他實施方式定義的方式。

9)因此,int可以通過定義爲int typedef名稱,或argv類型替換可寫爲 char ** argv,等等。

§5.1.2.2.3計劃終止

¶1如果main函數的返回類型與int兼容的類型,從最初的 調用該函數main返回相當於調用exit函數返回main函數返回的值 ; 10)達到}終止 main函數返回值0.如果返回類型與int不兼容,則返回到主機環境的終止狀態未指定。

10)按照第6.2.4節,在main 聲明的自動存儲持續時間對象的生命週期將在前者的情況已經結束,即使他們不會在後者有。

§7.20.4.3exit函數

¶5最後,控制返回到主機環境。如果狀態值爲零或返回EXTERN_SUCCESS,則狀態成功終止的實現定義形式爲 。如果狀態值爲EXIT_FAILURE,則返回狀態不成功終止的實現定義表格 。否則,返回的狀態是實現定義的 。

除了:請注意,§5.1.2.2.3清楚地表明,C標準允許實現,以允許返回類型其他main()int(不像C++標準,其中明確禁止比int其他返回類型)。但是,正如Jens正確指出的那樣,只有當實現明確聲明允許時,才允許從main返回非int返回類型,並且文檔可能會限制允許的內容。

+0

+1,但也許應該補充說'main'不返回'int'的屬性是「特定於實現」。那首先不是編譯器生產者選擇返回類型的用戶,其次是編譯器文檔中必須明確指定。 – 2012-01-01 10:09:00

1

int main (int argc, char * argv [])是用於當你想採取命令行參數。

EXIT_SUCCESS只是一個#define這比0更具描述性。

1

int main(int argc, char *argv[])允許用戶在程序執行時輸入參數,即程序名稱後在控制檯中寫入的文本。

return (EXIT_SUCCESS)是萬一一個O.S.不期望0作爲成功退出的值:它可以是任何其他值,但在大多數情況下,EXIT_SUCCESS等於0.

+0

即使返回到調用環境的值通常不會將0視爲成功(在這種情況下,0被映射爲將會返回的值),但從主或調用'exit(0)'返回0必須被解釋爲成功退出被視爲成功)。在我的回答中查看C99標準中的引號。 – 2012-01-01 06:49:43

1

(該兩件事情你問什麼都沒有做對方。)

要回答你的第一個問題: 有INT主要()只是意味着該計劃不接受命令行參數。 當它接受兩個參數時,argc是參數計數(它總是大於或等於1,因爲第一個參數將是程序本身的路徑或名稱),而argv是參數列表。

要回答你的第二個問題: EXIT_SUCCESS是保證被底層操作系統解釋爲成功。