> 技术文档 > 为什么C++主函数 main 要写成 int 返回值 | main(int argc, char* argv[]) 这种写法是什么意思?

为什么C++主函数 main 要写成 int 返回值 | main(int argc, char* argv[]) 这种写法是什么意思?

        主函数 main 要写成 int 返回值?

        main(int argc, char* argv[]) 为什么里面没有 cin 也能读到数据,数据是怎么传进去的?

        本文将一步步回答这些问题。

1. 为什么 main 要写成 int

        C++ 标准(ISO/IEC 14882)规定,main 必须返回 int,这是程序向操作系统报告执行结果的方式

原因

操作系统约定

        程序退出时需要给系统一个退出码(Exit Code),整数最合适

历史兼容性

        从 C 语言时代就规定了 int main,C++ 继承下来

        0表示程序成功结束

        非 0 表示发生错误,数值可以代表不同的错误类型。

示例

int main() { if (some_error_happened) { return 1; // 返回 1 表示出错 } return 0; // 返回 0 表示成功}

        在 Linux / macOS 终端:

./my_programecho $?

        在 Windows 命令行

my_program.exeecho %ERRORLEVEL%

2. main(int argc, char* argv[]) 是什么意思?

这是带参数main 形式,用来接收命令行参数

  • argc(argument count):命令行参数的个数(包含程序名本身)

  • argv(argument vector):一个字符串数组,存放每个参数

示例

#include using namespace std;int main(int argc, char* argv[]) { cout << \"参数个数: \" << argc << endl; for (int i = 0; i < argc; i++) { cout << \"argv[\" << i << \"] = \" << argv[i] << endl; } return 0;}

运行:

./my_program apple banana

输出:

参数个数: 3argv[0] = ./my_programargv[1] = appleargv[2] = banana

3. 为什么不用 cin 也能读到数据?

        这是因为 argc/argv 的数据是在程序启动之前就由操作系统传给你的,并不是在程序运行中输入的

流程大致如下:

  1. 用户在命令行输入:./my_program apple banana

  2. 操作系统解析命令,把每个空格分隔的部分作为一个参数

  3. 把这些参数存到内存里

  4. 调用 main(argc, argv),把参数个数和参数地址直接传进去

cin 是运行时从标准输入读取,需要用户在程序执行过程中输入

4. 怎么传入命令行参数?

命令行方式

g++ main.cpp -o my_program./my_program apple banana \"hello world\"

Visual Studio

  1. 右键项目 → 属性

  2. 配置属性 → 调试 → 命令参数 中填写参数。

VS Code

.vscode/launch.json 中配置

{ \"version\": \"0.2.0\", \"configurations\": [ { \"name\": \"Run with args\", \"type\": \"cppdbg\", \"request\": \"launch\", \"program\": \"${workspaceFolder}/my_program\", \"args\": [\"apple\", \"banana\", \"hello world\"], \"cwd\": \"${workspaceFolder}\" } ]}