main 函式
每個在託管執行環境中執行的 C 程式都包含一個名為 main
的函式的定義(而不是原型),它是程式的指定起點。
int main (void) { 函式體 } |
(1) | ||||||||
int main ( int argc, char *argv[]) { 函式體 } |
(2) | ||||||||
/* 另一個實現定義的簽名 */ (C99 起) | (3) | ||||||||
目錄 |
[編輯] 引數
argc | - | 一個非負值,表示從程式執行的環境傳遞給程式的引數數量。 |
argv | - | 指向 argc + 1 個指標陣列的第一個元素的指標,其中最後一個為 null,如果存在,前面的指標指向表示從宿主環境傳遞給程式的引數的字串。如果 argv[0] 不是空指標(或者,等效地,如果 argc > 0),它指向一個字串,該字串表示程式名稱,如果宿主環境不提供程式名稱,則該字串為空。 |
名稱 argc
和 argv
分別代表“argument count”(引數數量)和“argument vector”(引數向量),並且是傳統上使用的,但也可以為引數選擇其他名稱,以及不同但等效的型別宣告:int main(int ac, char** av) 同樣有效。
main 函式的一種常見的實現定義形式是 int main(int argc, char *argv[], char *envp[]),其中添加了第三個引數,型別為 char**,指向一個指向執行環境變數陣列的指標。
[編輯] 返回值
如果使用 return 語句,返回值將作為對 exit() 的隱式呼叫的引數(詳見下文)。值零和 EXIT_SUCCESS 表示成功終止,值 EXIT_FAILURE 表示不成功終止。
[編輯] 說明
main
函式在程式啟動時呼叫,所有具有靜態儲存持續時間的物件初始化之後。它是託管環境(即帶有作業系統的環境)中執行的程式的指定入口點。任何獨立程式(引導載入程式、作業系統核心等)的入口點名稱和型別都是實現定義的。
main 函式的兩引數形式允許從執行環境傳遞任意多位元組字串(這些通常被稱為命令列引數)。指標 argv[1] .. argv[argc-1] 指向這些字串中每個字串的第一個字元。argv[0](如果非空)是指向以 null 結尾的多位元組字串的初始字元的指標,該字串表示用於呼叫程式本身的名稱(或者,如果宿主環境不支援此功能,則保證 argv[0][0] 為零)。
如果宿主環境無法同時提供小寫字母和大寫字母,命令列引數將被轉換為小寫。
這些字串是可修改的,並且任何修改都會持續到程式終止,儘管這些修改不會傳播回宿主環境:它們可以用於,例如,strtok。
argv
指向的陣列的大小至少為 argc+1
,並且最後一個元素 argv[argc]
保證是空指標。
main
函式有幾個特殊屬性
如果 main 函式執行的 return 未指定值,或者等效地,在未執行 return 的情況下到達終止的 },則返回給宿主環境的終止狀態是未定義的。 |
(直到 C99) |
如果 main 函式的返回型別與 int 不相容(例如 void main(void)),則返回給宿主環境的值是未指定的。如果返回型別與 int 相容並且控制權到達終止的 },則返回給環境的值與執行 return 0; 相同。 |
(C99 起) |
[編輯] 示例
演示如何通知程式在哪裡找到其輸入以及在哪裡寫入其結果。呼叫方式:./a.out indatafile outdatafile
可能的輸出
argc = 3 argv[0] --> ./a.out argv[1] --> indatafile argv[2] --> outdatafile argv[argc] = (nil)
[編輯] 參考
- C23 標準 (ISO/IEC 9899:2024)
- 5.1.2.2.1 程式啟動 (p: 待定)
- C17 標準 (ISO/IEC 9899:2018)
- 5.1.2.2.1 程式啟動 (p: 10-11)
- C11 標準 (ISO/IEC 9899:2011)
- 5.1.2.2.1 程式啟動 (p: 13)
- C99 標準 (ISO/IEC 9899:1999)
- 5.1.2.2.1 程式啟動 (p: 12)
- C89/C90 標準 (ISO/IEC 9899:1990)
- 5.1.2.2 託管環境
[編輯] 參閱
C++ 文件 關於
main 函式 |