主函数 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 表示发生错误,数值可以代表不同的错误类型。
示例
cpp
int main() {
if (some_error_happened) {
return 1; // 返回 1 表示出错
}
return 0; // 返回 0 表示成功
}
在 Linux / macOS 终端:
cpp
./my_program
echo $?
在 Windows 命令行:
cpp
my_program.exe
echo %ERRORLEVEL%
2. main(int argc, char* argv[])
是什么意思?
这是带参数的 main
形式,用来接收命令行参数
-
argc
(argument count):命令行参数的个数(包含程序名本身) -
argv
(argument vector):一个字符串数组,存放每个参数
示例
cpp
#include <iostream>
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;
}
运行:
cpp
./my_program apple banana
输出:
cpp
参数个数: 3
argv[0] = ./my_program
argv[1] = apple
argv[2] = banana
3. 为什么不用 cin
也能读到数据?
这是因为 argc/argv
的数据是在程序启动之前就由操作系统传给你的,并不是在程序运行中输入的
流程大致如下:
-
用户在命令行输入:
./my_program apple banana
-
操作系统解析命令,把每个空格分隔的部分作为一个参数
-
把这些参数存到内存里
-
调用
main(argc, argv)
,把参数个数和参数地址直接传进去
而 cin
是运行时从标准输入读取,需要用户在程序执行过程中输入
4. 怎么传入命令行参数?
命令行方式
g++ main.cpp -o my_program
./my_program apple banana "hello world"
Visual Studio
-
右键项目 → 属性。
-
配置属性 → 调试 → 命令参数 中填写参数。
VS Code
在 .vscode/launch.json
中配置
cpp
{
"version": "0.2.0",
"configurations": [
{
"name": "Run with args",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/my_program",
"args": ["apple", "banana", "hello world"],
"cwd": "${workspaceFolder}"
}
]
}