C++可执行文件参数解析

前言

针对简单工程甚至是单cpp文件,C++可执行二进制的参数获取,getopt被用来解析命令行选项参数。该接口在unix的头文件<unistd.h>中定义。参数类型区分为短参数(只有一个中划线’-')、长参数(有2个中划线‘–’),接口函数不同。另外我们也可以采用第三方库来实现参数解析。下面逐一介绍。

getopt短参数解析

短参数是指二进制的参数以‘-’为开始的参数形式。例如:.\paras.exe -o /a/b/c -d 123 -v 2。注意参数和参数值之间没有‘=’符号,是空格。
接口原型: int getopt(int argc, char *const argv[], const char *optstring, int *ind);
说明:
+ int argc:从 main 函数传入的参数数量。
+ char *const argv[]:从 main 函数传入的参数数组。
+ const char *optstring:选项字符串,用于指定哪些选项是有效的。
+ int *ind:可选参数,用于记录解析的位置。
使用方法:

#include <stdio.h>
#include <unistd.h>namespace
{// short getopt example with three parameters, just like "hvo".not support "--" long options.// input:  .\paras.exe -o /a/b/c -d 123 -v 2// output: //      Output file set to /a/b/c//      depth set to 123//      Version set to 2int ExplainParametersWithoutGetOpt(int argc, char **argv){int ret = 0;int option;while ((option = getopt(argc, argv, "hv:o:d:")) != -1) {switch (option) {case 'h':printf("Help option selected.\n");break;case 'v':printf("Version set to %s\n", optarg);break;case 'o':printf("Output file set to %s\n", optarg);break;case 'd':printf("depth set to %s\n", optarg);break;case '?':printf("Unknown option '%c'.\n", optopt);ret = 1;break;default:printf("Unknown option.\n");ret = 1;break;}}return ret;}
}int main(int argc, char **argv)
{int ret = ExplainParametersWithoutGetOpt(argc, argv);return ret;
}

getopt_long长参数解析

getopt_long不但支持短参还支持长参解析。
长参数是指二进制的参数以‘–’(2个短横)为开始的参数形式。
**接口原型:**int getopt_long(int argc, char *const argv[], const char *shortopts,
const struct option *longopts, int *longindex);
接口参数:

  • argc 和 argv:这两个参数与 main 函数中的参数一致,分别表示命令行参数的数量和参数数组。
  • shortopts:这是一个字符串,表示短选项的格式。例如,“ab:c::” 表示 a 是无参数选项,b 是带必需参数的选项,c 是带可选参数的选项。
  • longopts:这是一个指向 struct option 数组的指针,用于定义长选项的格式。每个 struct option 结构体包含以下字段: name:长选项的名称。
  • has_arg:指示选项是否带参数,0 表示无参数,1 表示必需参数,2
    表示可选参数。
  • flag:如果为 NULL,则 getopt_long 返回 val;否则,返回 0,并将 val 存储到 flag
    指向的变量中。
  • val:将要返回的值或存储到 flag 指向的变量中的值。
  • longindex:这是一个指向整数的指针,用于返回长选项在 longopts 数组中的索引。通常设置为 NULL。

返回值
如果遇到有效的短选项或长选项,getopt_long 返回该选项的字符(对于短选项)或 val(对于长选项)。如果所有选项都已处理完毕,返回 -1。
使用方法:

#include <cstdio>
#include <getopt.h>
#include <unistd.h>static struct option long_options[] = {{"help", no_argument, nullptr, 'h'},{"version", required_argument, nullptr, 'v'},{"output", required_argument, nullptr, 'o'},{0, 0, 0, 0}
};int main(int argc, char *argv[]) {int option_index = 0;int c;int ret = 0;// binary execute: .\longgetopt.exe --version 2 --output d:\temp or .\longgetopt.exe -v 2 -o d:\temp// output: //      Verbosity set to 2//      Output file set to d:\tempwhile ((c = getopt_long(argc, argv, "hv:o:", long_options, &option_index)) != -1) {switch (c) {case 'h':printf("Help option selected.\n");break;case 'v':printf("Verbosity set to %s\n", optarg);break;case 'o':printf("Output file set to %s\n", optarg);break;case '?':printf("Unknown option '%c'.\n", optopt);ret = 1;break;default:printf("Unknown option.\n");ret = 1;break;}}return ret;
}

第三方库getopt解析

github有一个2016年的工程getopt, 封装了getopt,直接头文件引用就可以了。遗憾的是8年了没有更新。但学习C++参数解析够用了。
克隆代码到demo目录,目录层级如下;

$ tree -l
.paras
|-- paras.cpp
`-- thirdparty`-- getopt|-- README.md|-- demo.cc|-- getopt.cpp`-- getopt.hpp

应用代码:

#include <iostream>
// #include <string>
#include "thirdparty/getopt/getopt.hpp"namespace
{void ExplainParametersWithGetOpt(){// - No initialization required: (argc, argv) pair automatically retrieved.// - First argument is default option value, then all option indentifiers follow.//  binary execute: .\paras.exe -o=/a/b/c -d=123 -v=2// output: 0,/a/b/c,123,2bool help = getarg(false, "-h", "--help", "-?");int version = getarg(0, "-v", "--version", "--show-version");int depth = getarg(1, "-d", "--depth", "--max-depth");std::string file = getarg("", "-o", "--outputfile");std::cout << help << ',' << file << ',' << depth << ',' << version << std::endl;}
}int main()
{std::cout << "Explain parameters with getopt lib" << std::endl;ExplainParametersWithGetOpt();return 0;
}

使用分析:第三方库getopt参数是短参接‘=‘,再接参数值形式。‘=‘不能省。少了一些全局变量。

总结

对于指定二进制或单个cpp,最终二进制启动参数的解析可以使用多种方法,看你的使用习惯。一般长短参都支持,程序的友好性较高。第三方包功能单一,若有更高需要,可以自己扩充。

参考文献

[1] getopt与getopt_long, slmmlk2011_2
h,ttps://blog.csdn.net/slmmlk2011_2/article/details/7964218?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7EPaidSort-1-7964218-blog-142920234.235%5Ev43%5Epc_blog_bottom_relevance_base2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7EPaidSort-1-7964218-blog-142920234.235%5Ev43%5Epc_blog_bottom_relevance_base2&utm_relevant_index=2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/65012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跟踪方案和小语法

语法一&#xff1a; case when cond1 then res1 [when cond2 then res2] else res end; 这种语法用于条件判断&#xff0c;其中 cond1 和 cond2 是需要评估的条件。如果 cond1 为真&#xff0c;则执行 res1。如果 cond1 为假&#xff0c;程序会继续检查 cond2&#xff0c;如果…

大恒相机开发(2)—Python软触发调用采集图像

大恒相机开发&#xff08;2&#xff09;—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序&#xff0c;用于从大恒相机采集图像&#xff0c;通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码&#xff1a; # version:…

基于SSM(Spring + Spring MVC + MyBatis)框架构建一个图书馆仓储管理系统

基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架构建一个图书馆仓储管理系统是一个涉及多个功能模块的项目&#xff0c;包括但不限于图书管理、读者管理、借阅管理、归还管理等。 1. 环境准备 确保你已经安装了以下工具和环境&#xff1a; Java Developmen…

WebDavClient 安装和配置指南

WebDavClient 安装和配置指南 WebDavClient Asynchronous cross-platform WebDAV client for .NET Core [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/we/WebDavClient 1. 项目基础介绍和主要编程语言 WebDavClient 是一个异步的跨平台 WebDAV 客户端&#xf…

记一次某企业管理系统通用SQL注入挖掘

更多视频教程可看主页和专栏 目录: 一、资产发现 二、通用漏洞挖掘 三、通用漏洞经验总结 一、资产发现 通过漏洞挖掘过程中发现该系统存在sql注入 1.二话不说先来个单引号显示 ‘011111111111111’’) ) 再来一个单号试一试可不可以把他闭合掉 换成报错注入的poc 发现右边…

Mybatis 如何复用 SQL

比如你的Mapper是这样写的&#xff1a; 但这个接口是没有分页的&#xff0c;你还想再写一个有分页的查询接口&#xff0c;两个接口SQL一模一样&#xff0c;只是多了分页特性。你可以直接重载一个方法&#xff0c;增加分页参数&#xff0c;即可复用该SQL。如下&#xff1a;

python ai框架

Python是AI和机器学习领域最常用的编程语言之一&#xff0c;拥有大量的工具和库&#xff0c;下面是一些常见的Python AI工具&#xff0c;它们涵盖了从数据处理到模型训练、评估和部署的各个方面&#xff1a; 1. 机器学习与深度学习框架 TensorFlow&#xff1a;由Google开发的开…

Autosar入门_OS_2

上一篇 | 返回主目录 | 下一篇 OS调度机制 1 基本概念2 Tasks2.1 调度方式2.1.1 完全抢占式调度2.1.2 非抢占式调度2.1.3 混合抢占式调度2.2 激活方式2.2.1 系统定时2.2.2 调度表2.3 执行逻辑及分类2.4 任务堆栈2.5 任务基本属性3 Event4 ISRs1 基本概念 首先,明确三个基本概…

Redis 介绍和安装

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Redis 入门介绍 收录于专栏[redis] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 本章将带领读者进入 Redis 的世…

我的性能优化经验

专业方向&#xff1a;App cpu/memory/gpu/流畅度/响应时间的优化&#xff0c;Anr&#xff0c;Framework CarPowerManagementService模块的&#xff08;STR&#xff09;&#xff0c;从0~1完成性能监控体系搭建&#xff0c;完成3大版本迭代高质量性能交付 响应时间&#xff1a; …

快速解决VRay渲染慢问题

在3D设计与渲染领域&#xff0c;VRay渲染器无疑是一款强大且广泛使用的工具&#xff0c;但很多小伙伴在使用它进行 CPU 渲染时&#xff0c;都遇到过速度慢得让人抓狂的情况。今天&#xff0c;我就来给大家分享两套切实可行的解决方案。 当我们将 VRay渲染器与 DMAX或Maya搭配使…

C++ 23版的最新特性

C 23 是 C 编程语言的最新标准版本&#xff0c;于 2023 年正式发布&#xff0c;带来了诸多新特性与改进&#xff0c;以下是一些主要内容&#xff1a; 1.语言特性 1.显式对象参数&#xff08;Deducing this&#xff09;&#xff1a;显式对象参数&#xff08;Deducing this&…

《庐山派从入门到...》PWM板载蜂鸣器

《庐山派从入门到...》PWM板载蜂鸣器 配置PWM模块控制板载无源蜂鸣器播放【一闪一闪亮晶晶】播放do re mi 《庐山派从入门到...》PWM控制无源蜂鸣器 PWM&#xff08;Pulse Width Modulation&#xff0c;脉宽调制&#xff09;是一种在嵌入式系统中常用的技术&#xff0c;它可以用…

2024-12-24 NO1. XR Interaction ToolKit 环境配置

文章目录 1 软件配置2 安装 XRToolKit3 配置 OpenXR4 安装示例场景5 运行测试 1 软件配置 Unity 版本&#xff1a;Unity6000.0.26 ​ 2 安装 XRToolKit 创建新项目&#xff08;URP 3D&#xff09;&#xff0c;点击进入 Asset Store。 进入“Unity Registry”页签&#xff0…

ChatGPT生成接口测试用例(一)

用ChatGPT做软件测试 接口测试在软件开发生命周期中扮演着至关重要的角色&#xff0c;有助于验证不同模块之间的交互是否正确。若协议消息被恶意修改&#xff0c;系统是否能够恰当处理&#xff0c;以确保系统的功能正常运行&#xff0c;不会出现宕机或者安全问题。 5.1 ChatGP…

安卓15预置第三方apk时签名报错问题解决

有同事反馈集成apk时安装失败 PackageManager: Failed to scan /product/app/test: No APK Signature Scheme v2 signature in package /product/app/test/test.apk 查看编译后的apk签名信息 DOES NOT VERIFY ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.SF indi…

SWIFT基本使用

安装 # 全量能力 pip install ms-swift[all] -U # 仅使用LLM pip install ms-swift[llm] -U # 仅使用AIGC pip install ms-swift[aigc] -U # 仅使用Adapters pip install ms-swift -U or git clone https://github.com/modelscope/ms-swift.git cd ms-swift pip install -e …

YOLOV8涨点技巧(源码)

YOLOV8涨点技巧之替换骨干网络(需要源码请私信或评论) 模型架构 YOLOv8模型架构包含 输入端、骨干网络(Backbone)、颈部(Neck)和预测头(Prediction) 。其中: 输入端负责处理图像并调整尺寸 Backbone提取多层次特征 Neck整合这些特征 Prediction模块进行最终预测。 这种设计…

【C语言】指针数组、数组指针、函数指针、指针函数、函数指针数组、回调函数

【C语言】函数指针与指针函数 文章目录 [TOC](文章目录) 前言一、指针数组二、数组指针三、函数指针四、指针函数五、函数指针数组六、回调函数七、参考资料总结 前言 使用工具&#xff1a; 1.DEVC 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、…

【04-数据库面试】

如何创建一个新的数据库 数据库是现代信息技术中不可或缺的一部分&#xff0c;它为存储、检索和管理数据提供了强大的工具。无论是企业还是个人&#xff0c;都可能需要创建自己的数据库以满足特定的需求。本文将详细介绍创建一个新数据库的步骤&#xff0c;包括规划、选择数据…