關於 main 函數的正確宣告,歷經 C89、C99、C11 多個標準演進,網路上流傳許多過時或錯誤資訊。本文依據 ISO/IEC 9899:1999 (C99) 標準,釐清兩種標準簽名的適用場景與常見誤區。
int main(void) {
// 程式邏輯
return 0;
}
適用於不需處理命令列參數的程式。void 明確表示不接受任何參數,符合 C99 6.5.2.2 規範。
int main(int argc, char *argv[]) {
// argc: 參數個數 (含程式名稱)
// argv: 參數字串陣列,argv[0] 為程式名稱
return 0;
}
等價寫法:int main(int argc, char **argv)。適用於需處理命令列引數的程式,適用範圍更廣。
| 錯誤寫法 | 問題 | 修正 |
|---|---|---|
void main() | 回傳型別非 int,違反標準 | int main(void) |
main() | 隱式 int 已被 C99 廢除 | int main(void) |
int main() | 未指定參數列表 (舊式 K&R 風格) | int main(void) |
int main(int argc, char *argv) | argv 型別錯誤 | int main(int argc, char *argv[]) |
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s \n", argv[0]);
return EXIT_FAILURE; // 非零值,表示異常結束
}
// ...
return EXIT_SUCCESS; // 等同於 0
}
stdlib.h 定義 EXIT_SUCCESS (0) 與 EXIT_FAILURE (1),提升跨平台可移植性。
// POSIX 環境:環境變數 int main(int argc, char *argv[], char *envp[]); // Windows Unicode 支援 int wmain(int argc, wchar_t *argv[]);
這些屬於平台擴展,編寫可移植程式碼時應避免依賴。
_Noreturn 屬性標記不返回函數[[noreturn]] 標準屬性main 函數簽名規定未變更,兩種標準形式持續有效int main(int argc, char *argv[]),未來擴充無需修改簽名-Wall -Wextra -pedantic 捕捉非標準寫法遵循標準的 main 函數宣告,不僅符合規範,更能確保程式在不同編譯器、作業系統、架構間的可移植性。拒絕 void main() 等歷史遺留寫法,從入門開始養成正確習慣。