void main() 從未存在於 C/C++ 標準中無數教材、網路範例甚至書籍使用 void main(),但 C++ 之父 Bjarne Stroustrup 明確指出:void main() 從未是合法的 C 或 C++。
int main(void) // 無參數
int main(int argc, char *argv[]) // 有命令列參數
// 等價寫法:char **argv
int main() // 無參數,等同 C 的 int main(void)
int main(int argc, char *argv[]) // 有命令列參數
int 返回值傳遞給呼叫者(作業系統/Shell),表示程式結束狀態0 或 EXIT_SUCCESS:正常結束C99 與 C++98 規定:若 main 結尾無 return,編譯器必須自動插入 return 0;。但 VC6 不支援此特性,建議明確撰寫 return 0; 養成好習慣。
// test_return.c
int main(void) { return 0; }
Windows 命令列測試:
> test_return.exe
> echo %ERRORLEVEL%
0
> test_return.exe && dir
(會執行 dir,因前一程式返回 0)
> 若改為 return -1 重新編譯:
> test_return.exe && dir
(不執行 dir,因前一程式非零返回)
| 錯誤寫法 | 問題 |
|---|---|
void main() | 標準未定義,移植性極差 |
void main(void) | 同左 |
main() (C89 風格) | C99 起不建議,隱式 int 已棄用 |
int main(int argc, char *argv[], char *envp[]) | 擴充參數,非標準 |
void main 會報錯或警告void main,新版 (/std:c++17) 亦會警告永遠使用標準簽名:
// C
int main(void) { /* ... */ return 0; }
// C++
int main() { /* ... */ return 0; }
若需命令列參數,再加 argc/argv。這能確保程式在所有標準相容平台正確編譯執行。