main函数必须返回int类型,因C++标准强制要求其向操作系统传递退出状态,返回0表示成功,非零值表示异常;void main()等写法不合法或不可移植。

标准写法只有两种:int main() 和 int main(int argc, char* argv[])。其他形式要么不合法,要么不可移植。
为什么必须是 int 返回类型
C++ 标准强制要求 main 返回 int,这是为了向操作系统传递退出状态。返回 0 表示成功,非零值(如 1)通常表示异常。
-
void main()在 Clang/GCC 下直接报错:error: 'main' must return 'int' - 旧版 MSVC 可能容忍它,但嵌入式工具链或 CI 环境里一跑就链接失败
-
main()(无返回类型)语法错误,C++ 不允许省略返回类型 - 显式写
return 0;不是必须的——C++11 起,函数末尾自动补return 0;,但建议保留,意图更清晰
带参和无参的区别与选择
是否需要读取命令行参数,决定了用哪种签名。
-
int main():最简形式,适合 Hello World 或配置全硬编码的程序 -
int main(int argc, char* argv[]):唯一标准带参形式;char** argv等价,但前者更常见 -
int main(int argc, char* argv[], char* envp[])是 POSIX 扩展,非标准,别依赖 -
int main(void)是 C 风格写法,在 C++ 中合法但不常用;C++ 更倾向空括号表示“无参数”
argc 和 argv 的安全使用习惯
越界访问 argv[i] 是高频崩溃点,尤其在没检查 argc 就直接用 argv[1] 时。
立即学习“C++免费学习笔记(深入)”;
-
argv[0]是程序名,但可能为空、不含路径,别直接传给std::filesystem::path -
argv[argc]保证为nullptr,这是唯一可依赖的哨兵值;argv[argc + 1]是未定义行为 - 永远先判断:
if (argc > 1) { std::string flag = argv[1]; } - Windows 下宽字符支持需用
wmain(MSVC 扩展),但会牺牲跨平台性
最容易被忽略的是:你不能把 main 当普通函数用——不能取地址(&main 编译报错)、不能重载、不能递归调用。想复用逻辑?把它拆进 run_app() 这类函数里,再让 main 去调用。


















