我的工作我的C技能,我已經注意到,
INT主(INT ARGC ,char * argv [])
和
回報(EXIT_SUCCESS)
,而不是
INT主要(),並返回0
這是爲什麼?
我的工作我的C技能,我已經注意到,
INT主(INT ARGC ,char * argv [])
和
回報(EXIT_SUCCESS)
,而不是
INT主要(),並返回0
這是爲什麼?
如果你要忽略參數列表,它是合理的,合理的使用方法:
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) { /* ... */ }
或兩個參數(這裏稱爲
argc
和argv
,雖然任何名稱可能是 使用,因爲它們是本地的在其中聲明它們的功能):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
返回類型,並且文檔可能會限制允許的內容。
+1,但也許應該補充說'main'不返回'int'的屬性是「特定於實現」。那首先不是編譯器生產者選擇返回類型的用戶,其次是編譯器文檔中必須明確指定。 – 2012-01-01 10:09:00
int main (int argc, char * argv [])
是用於當你想採取命令行參數。
EXIT_SUCCESS
只是一個#define
這比0
更具描述性。
int main(int argc, char *argv[])
允許用戶在程序執行時輸入參數,即程序名稱後在控制檯中寫入的文本。
return (EXIT_SUCCESS)
是萬一一個O.S.不期望0作爲成功退出的值:它可以是任何其他值,但在大多數情況下,EXIT_SUCCESS等於0.
即使返回到調用環境的值通常不會將0視爲成功(在這種情況下,0被映射爲將會返回的值),但從主或調用'exit(0)'返回0必須被解釋爲成功退出被視爲成功)。在我的回答中查看C99標準中的引號。 – 2012-01-01 06:49:43
操作系統可以在程序指示操作成功的方式上有所不同。理想情況下,宏EXIT_SUCCESS
擴展爲適合編譯該程序的系統的值。
(該兩件事情你問什麼都沒有做對方。)
要回答你的第一個問題: 有INT主要()只是意味着該計劃不接受命令行參數。 當它接受兩個參數時,argc是參數計數(它總是大於或等於1,因爲第一個參數將是程序本身的路徑或名稱),而argv是參數列表。
要回答你的第二個問題: EXIT_SUCCESS是保證被底層操作系統解釋爲成功。
雖然這裏有兩個問題。 – 2012-01-01 06:48:07
@ChristianJonassen:常見問題也討論從main()返回。 – 2012-01-01 06:48:50
你說得對。這個問題是重複的。 – 2012-01-01 06:54:29