亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C的main()函數的有效簽名是什么?

C的main()函數的有效簽名是什么?

C
繁星coding 2019-06-26 17:21:00
C的main()函數的有效簽名是什么?C中主函數的有效簽名是什么?我知道:int main(int argc, char *argv[])還有其他有效的嗎?
查看完整描述

3 回答

?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

在作出這一答復時,目前的標準(C11)明確提到以下兩點:

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

雖然它確實提到了“或等同”一語,但有以下腳注:

因此,int可以用typedef定義為int的類型argv可以寫成char ** argv等等。

此外,它還提供了更多(實現定義的)可能性。

相關章節(C11第5.1.2.2.1節,但這一特定方面與C99沒有變化)指出:

在程序啟動時調用的函數名為main..該實現沒有聲明此函數的原型。它應定義為返回類型為int在沒有參數的情況下:

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

或者有兩個參數(在這里稱為argcargv(雖然可以使用任何名稱,因為它們是聲明它們的函數的本地名稱):

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

或等效;或以其他實現-定義的方式。

如果聲明了這些參數,則main職能應遵守下列限制:

  • 價值argc應該是非否定的。

  • argv[argc]將為空指針。

  • 如果argc大于零,則數組成員argv[0]貫通argv[argc-1]包容性應該包含指向字符串的指針,這些指針是由主機環境在程序啟動之前給出的實現定義的值。其目的是從宿主環境中的其他地方向程序啟動之前確定的程序信息提供。如果主機環境不能同時提供大寫字母和小寫字母,則實現應確保以小寫接收字符串。

  • 如果argc值大于零,所指向的字符串為argv[0]表示程序名稱;argv[0][0]如果程序名在主機環境中不可用,則為空字符。如果argc大于1,所指向的字符串由argv[1]貫通argv[argc-1]表示程序參數。

  • 參數argcargv和字符串所指向的argv數組應由程序修改,并在程序啟動和程序終止之間保留其最后存儲的值。

請注意,這是一個托管環境,您通常在C程序中看到。正如同一標準的5.1.2.1所述,獨立的環境(例如嵌入式系統)的約束要小得多:

在一個獨立的環境中(在這個環境中,C程序可以在沒有操作系統任何好處的情況下執行),在程序啟動時調用的函數的名稱和類型都是實現定義的。任何可供獨立程序使用的庫設施,除了第4條所要求的最小設置外,都是實現定義的。


查看完整回答
反對 回復 2019-06-26
?
慕森王

TA貢獻1777條經驗 獲得超3個贊

標準C

對于宿主環境(這是正常的),C99標準說:

5.1.2.2.1啟動程序

在程序啟動時調用的函數名為main..該實現沒有聲明此函數的原型。它應定義為返回類型為int在沒有參數的情況下:

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

或者有兩個參數(在這里稱為argcargv(雖然可以使用任何名稱,因為它們是聲明它們的函數的本地名稱):

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

或同等;9)或者以其他實現定義的方式。

9)因此,int可以用定義為int的類型argv可以寫成char **argv等等。

C11和C18標準基本上與C99標準相同。

標準C+

C+98標準規定:

3.6.1主要功能[basic.start.main]

1程序應包含一個稱為Main的全局函數,它是程序的指定開始。[.]

2實施不應預定義主要職能。此功能不應超載。它應該有一個int類型的返回類型,但否則它的類型是定義的。所有實現都應允許Main的以下兩種定義:

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

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

C+標準明確表示“它[主函數]應該有一個int類型的返回類型,但否則它的類型是實現定義的”,并且需要與C標準相同的兩個簽名。因此,C+標準直接不允許使用“voidmain()”,盡管它無法阻止非標準一致性實現允許替代品(也不允許標準一致性實現作為標準的擴展)。

C+03、C+11、C+14和C+17標準與C+98基本相同。

公共延伸

傳統上,Unix系統支持第三種變體:

int main(int argc, char **argv, char **envp) { ... }

第三個參數是指向字符串的以空結尾的指針列表,每個字符串都是一個環境變量,它有一個名稱、一個等號和一個值(可能是空的)。如果您不使用這個,您仍然可以通過extern char **environ;“”很長一段時間以來,它沒有一個標頭來聲明它,但是POSIX 2008標準現在要求它在<unistd.h>.

C標準承認這是一項共同的擴展,載于附件J:

J.5.1環境論點

在宿主環境中,主函數接收第三個參數,char *envp[],它指向以空結尾的指針數組。char,每個字符串指向一個字符串,該字符串提供有關此程序執行環境的信息(5.1.2.2.1)。

微軟C

這個微軟訴2010編譯器很有趣。該網站說:

main的聲明語法是

 int main();

或者,可以選擇,

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

或者,mainwmain函數可以聲明為返回。void(無返回值)。如果你宣布mainwmain作為返回空,您不能使用返回語句將退出代碼返回到父進程或操作系統。若要返回退出代碼,請執行以下操作:mainwmain被宣布為void,您必須使用exit功能。

對于我來說,不清楚當程序返回到父程序或o/s時會發生什么(退出代碼返回給父程序或o/s)。void main()退出-和MS網站也是沉默的。

有趣的是,MS沒有規定main()C和C+標準所要求的。它只規定了三個參數形式,其中第三個參數是char **envp指向環境變量列表的指針。

微軟的網頁還列出了其他一些選擇-wmain()這需要很寬的字符串,還有更多。

Microsoft與2005版本的本頁不列void main()作為另一種選擇。這個版本從微軟到2008年以后。

int main()int main(void)?

有關詳細分析,請參閱我對什么應該main()返回C和C+..(我似乎曾經認為這個問題指的是C+,盡管它沒有而且從來沒有提到過。在C+中,int main()int main(void)int main()是習語C+)

在C中,這兩種符號之間有區別,但您只注意到在深奧的情況下。具體來說,如果您調用main()函數從您自己的代碼中執行,您可以在C中執行,而在C+中不允許這樣做。

這個int main()表示法不提供main(),但只有當您遞歸地調用它時,這才重要。帶著int main(),您可能稍后(在同一個函數中或在另一個函數中)寫入int rc = main("absolute", "twaddle", 2):在形式上,編譯器不應該抱怨到拒絕編譯代碼的程度,盡管它可能會合理地抱怨(警告您)(并使用-WerrorGCC將把警告轉化為錯誤)。如果你用int main(void)的后續呼叫main()應該產生一個錯誤-你說過這個函數不帶參數,但試圖提供三個。當然,你不能合法地打電話main()在聲明或定義它之前(除非您仍然使用C90語義)-而且實現不聲明原型main()..注:C11標準說明了兩者int main()int main(void)在不同的例子中,兩者在C中都是有效的,盡管它們之間有細微的區別。


查看完整回答
反對 回復 2019-06-26
?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

POSIX支持execve(),這反過來又支持

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

添加的參數是環境,即表單name=value的字符串數組。


查看完整回答
反對 回復 2019-06-26
  • 3 回答
  • 0 關注
  • 696 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號