为什么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 表示发生错误,数值可以代表不同的错误类型。

示例

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 的数据是在程序启动之前就由操作系统传给你的,并不是在程序运行中输入的

流程大致如下:

  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 中配置

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}"
        }
    ]
}
相关推荐
进化中的刀盾兽9 分钟前
从零实现 C++ Json-Rpc(九):从 TCP 字节流中拆出完整消息——MuduoBuffer 与 LVProtocol
c++·rpc
Xiu Yan16 分钟前
Python 数据分析:数据分析步骤
开发语言·python·数据分析
黑妹天下第一乖25 分钟前
小智改造实战解读-用kokoro-onnx替换云端 TTS 的完整记录
大数据·开发语言·人工智能·python·交互
郑州光合科技余经理26 分钟前
本地生活平台搭建:跨业态用户标识怎么贯通
java·开发语言·前端·后端·uni-app·php·ai编程
HZY1618yzh34 分钟前
下一代编程语言出炉
c++·算法
深盾科技_Virbox35 分钟前
云端与本地并行交付,软件许可管理如何实现统一运营?
java·大数据·开发语言·安全
wyhwust1 小时前
No1-绪论
c++
无名猿1 小时前
C++ 对象内存模型:vtable 布局、多继承 vptr、RTTI 与 dynamic_cast 走查
c++·内存管理·调试技巧·现代c++
xuxigifxfh1 小时前
HJ15 求int型正整数在内存中存储时1的个数
java·开发语言·华为机考
Wokoo71 小时前
自动化测试入门:核心场景、回归测试与 Web 自动化环境搭建
java·开发语言·测试工具