跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++AI算法

C++ 与 ROS 中 int main(int argc, char* argv[]) 的区别

对比了标准 C++ 与 ROS 环境下 main 函数的差异。重点解释了 argc 和 argv 的含义及其在 ROS 初始化中的必要性。说明了 ros::init 如何解析命令行参数以支持节点名覆盖、命名空间设置及 Master 地址指定。指出在 ROS 中 argc/argv 是必须的,否则 remap 等功能将失效。

战神发布于 2026/3/30更新于 2026/10/26115 浏览

引言

我们在用 C++ 写 ROS 代码的时候每次都会写下面这几个必须项,是否有时候会有疑问为什么要这样写?下面我将从 C++ 和 ROS 的两个角度分别去解释这些。

int main(int argc, char *argv[]) { ros::init(argc,argv,"节点名称"); ros::NodeHandle n; return 0; }

一、先不管 ROS:这是「标准 C++」里的 main

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

这是 程序的入口函数,操作系统在启动程序时:

  • 自动调用 main
  • 自动传入参数
  • 自动接收返回值
int main(int argc, char* argv[]) 

不是你在'创建变量',而是 操作系统帮你填好的参数。

2. argc 是什么?

argument count(参数个数)

int argc 

表示 命令行参数的数量

注意:

  • 至少是 1
  • 第 0 个参数永远是 程序本身的名字

例子:

  • 程序名:./demo
  • 参数列表:123、abc
./demo 10 hello 

那么:

argc == 3 

3. argv 是什么?

argument vector(参数数组)

char* argv[] 

本质是:

char** argv 

在 C++ 中:char** argv = char* argv[]

一个字符串数组

索引内容
argv[0]程序路径
argv[1]第一个参数
argv[2]第二个参数

4. char* argv[] 为什么是 char*

因为:

  • 命令行参数本质是字符串
  • 在 C/C++ 中字符串 = char*

5. main 返回的 int 是干嘛的?

return 0; 

表示:

  • 程序 正常退出
return 1; 

表示:

  • 程序 异常退出

二、在 ROS 里:main 发生了什么变化?

1. ROS 的 main 还是 C++ 的 main 吗?

完全一样

int main(int argc, char** argv) 

这仍然是:

  • 标准 C++
  • 操作系统调用

ROS 并没有改 C++ 规则

三、ROS 中为什么「必须」要 argc / argv?

关键在这一句

ros::init(argc, argv, "node_name"); 

1. ros::init() 在干嘛?

ros::init(argc, argv, "talker"); 

它做的事情包括:

  • 初始化 ROS 节点
  • 解析 ROS 的命令行参数
  • 连接 ROS Master
  • 处理 remap、参数覆盖

这里必须传入 argc / argv

2. ROS 命令行参数 ≠ 你自己写的参数

举个非常重要的例子

rosrun my_pkg my_node __name:=node1 

或:

rosrun my_pkg my_node _rate:=10 

这些:

__name:=node1 _rate:=10 

不是你的参数 是 ROS 的参数

ROS 里以 __ 开头的参数,是"ROS 保留的内部参数',用来和用户自己的参数做'强区分'。

  • __xxx:=yyy ROS 自己用
  • xxx:=yyy 你写节点、launch 文件用

解释:

__name:=xxx 覆盖节点名

rosrun pkg node __name:=camera_node

等价于:

ros::init(argc, argv, "camera_node");

但 命令行优先级更高

__ns:=xxx 设置节点命名空间

__ns:=/robot1

节点里的话题:

nh.advertise("cmd_vel", 10);

实际变成:

/robot1/cmd_vel

__log:=xxx 指定日志文件路径

常用于:

  • 多机
  • Docker
  • 权限受限系统

__master:=xx 指定 ROS Master 地址

__master:=http://192.168.1.2:11311

等价于环境变量:

export ROS_MASTER_URI=...

3. ROS 是怎么拿到这些参数的?

答案就是:

int argc, char* argv[] 

操作系统 → 把参数交给 main main → 把参数交给 ros::init ros::init → 解析 ROS 参数

4. 如果你不用 argc / argv 会怎样?

错误示例:

ros::init(0, nullptr, "node"); 

后果:

  • ROS remap 失效
  • _param:= 失效
  • __name:= 失效
  • 有些 launch 行为异常

四、对比总结:普通 C++ vs ROS

项目普通 C++ROS
main 入口OS 调用OS 调用
argc命令行参数个数命令行参数个数
argv字符串数组字符串数组
是否必须可选必须
参数用途程序逻辑ROS 初始化 + remap

在普通 C++ 中,argc/argv 是你'可用可不用'的参数 在 ROS 中,argc/argv 是 ROS 节点的'生命线'

目录

  1. 引言
  2. 一、先不管 ROS:这是「标准 C++」里的 main
  3. 1. int main(int argc, char* argv[]) 是什么?
  4. 2. argc 是什么?
  5. 3. argv 是什么?
  6. 4. char argv[] 为什么是 char
  7. 5. main 返回的 int 是干嘛的?
  8. 二、在 ROS 里:main 发生了什么变化?
  9. 1. ROS 的 main 还是 C++ 的 main 吗?
  10. 三、ROS 中为什么「必须」要 argc / argv?
  11. 1. ros::init() 在干嘛?
  12. 2. ROS 命令行参数 ≠ 你自己写的参数
  13. __name:=xxx 覆盖节点名
  14. __ns:=xxx 设置节点命名空间
  15. __log:=xxx 指定日志文件路径
  16. __master:=xx 指定 ROS Master 地址
  17. 3. ROS 是怎么拿到这些参数的?
  18. 4. 如果你不用 argc / argv 会怎样?
  19. 四、对比总结:普通 C++ vs ROS

更多推荐文章

查看全部
  • 实战 Pi0 机器人控制中心:实现机器人智能操控
  • Flutter 库 llm_json_stream 的鸿蒙化适配与流式 JSON 解析
  • Stable Diffusion 3.5 移动端方案:手机连接云端 GPU 创作
  • Java 中间件:RabbitMQ 延迟队列(死信交换机实现)
  • 网络安全基础教程:概念、加密与攻击防护
  • OpenClaw 配置多 Agent、多 QQ 及飞书机器人指南
  • Java 核心面试题与答案详解
  • 基于魔塔社区环境从零微调 Yi 开源大模型实战
  • 面向 C++ 开发的 Web 自动化测试入门:从概念到 Selenium 实战
  • 手搓简易 Linux 进程池:基于管道实现任务分发
  • C 语言代码优化与性能调优实战:编译器、内存与算法
  • AI 大模型在工业领域的应用模式与实现路径
  • ChatGPT 保护指令:提升 GPTs 提示词与知识库安全性
  • 2026 AI 医疗行业专题报告:智能医疗器械、手术机器人、脑机接口与可穿戴设备
  • Eclipse 环境搭建与第一个 Java 程序 HelloWorld 实战
  • 用 AI 把网页 URL 生成 Tailwind CSS 的实战记录
  • Python YAML 模块实战:接口测试参数存储与配置
  • Qt 前后端通信(QWebChannel Js / C++ 互操作):原理、示例、步骤解说
  • Apache IoTDB 跨端边云时序数据库架构与特性解析
  • 大模型应用开发入门:GPT-4、LangChain 与微调技术详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online