首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 主函數簽名規範:void main() 是錯誤的

     編輯:關於C++

為什麼 void main() 從未存在於 C/C++ 標準中

無數教材、網路範例甚至書籍使用 void main(),但 C++ 之父 Bjarne Stroustrup 明確指出:void main() 從未是合法的 C 或 C++。

標準規定的合法簽名

C 語言 (C99/C11/C17)

int main(void)                    // 無參數
int main(int argc, char *argv[])  // 有命令列參數
// 等價寫法:char **argv

C++ (C++98 至 C++20)

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[])擴充參數,非標準

編譯器行為差異

  • GCC/Clang:void main 會報錯或警告
  • MSVC:舊版接受 void main,新版 (/std:c++17) 亦會警告

最佳實務

永遠使用標準簽名:

// C
int main(void) { /* ... */ return 0; }

// C++
int main() { /* ... */ return 0; }

若需命令列參數,再加 argc/argv。這能確保程式在所有標準相容平台正確編譯執行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved