名稱空間
變體
操作

main 函式

來自 cppreference.com
< c‎ | language

每個在託管執行環境中執行的 C 程式都包含一個名為 main 的函式的定義(而不是原型),它是程式的指定起點。

int main (void) { 函式體 } (1)
int main (int argc, char *argv[]) { 函式體 } (2)
/* 另一個實現定義的簽名 */ (C99 起) (3)

目錄

[編輯] 引數

argc - 一個非負值,表示從程式執行的環境傳遞給程式的引數數量。
argv - 指向 argc + 1 個指標陣列的第一個元素的指標,其中最後一個為 null,如果存在,前面的指標指向表示從宿主環境傳遞給程式的引數的字串。如果 argv[0] 不是空指標(或者,等效地,如果 argc > 0),它指向一個字串,該字串表示程式名稱,如果宿主環境不提供程式名稱,則該字串為空。

名稱 argcargv 分別代表“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 函式有幾個特殊屬性

1) 程式不能為此函式提供原型。
2) 如果 main 函式的返回型別與 int 相容,則對 main 的初始呼叫(但不包括任何後續的遞迴呼叫)的返回等效於執行 exit 函式,並將 main 函式的返回值作為引數傳遞(然後呼叫透過 atexit 註冊的函式,重新整理並關閉所有流,刪除用 tmpfile 建立的檔案,並將控制權返回給執行環境)。
3)

如果 main 函式執行的 return 未指定值,或者等效地,在未執行 return 的情況下到達終止的 },則返回給宿主環境的終止狀態是未定義的。

(直到 C99)

如果 main 函式的返回型別與 int相容(例如 void main(void)),則返回給宿主環境的值是未指定的。如果返回型別與 int 相容並且控制權到達終止的 },則返回給環境的值與執行 return 0; 相同。

(C99 起)

[編輯] 示例

演示如何通知程式在哪裡找到其輸入以及在哪裡寫入其結果。呼叫方式:./a.out indatafile outdatafile

#include <stdio.h>
 
int main(int argc, char *argv[])
{
    printf("argc = %d\n", argc);
    for (int ndx = 0; ndx != argc; ++ndx)
        printf("argv[%d] --> %s\n", ndx, argv[ndx]);
    printf("argv[argc] = %p\n", (void*)argv[argc]);
}

可能的輸出

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 函式