复兴企业做网站推广/深圳宝安seo外包

复兴企业做网站推广,深圳宝安seo外包,手机qq网页版网站,淘宝请人做网站被骗首选的现代C风格命令行参数解析器! (本课程包含两段教学视频。) 以文件对象监控程序为实例,五分钟实现从命令行读入多个监控目标路径;区分两大时机,学习 CLI11 构建与解析参数两大场景下的异常处理;区分三…

首选的现代C++风格命令行参数解析器!
(本课程包含两段教学视频。)
CLI11-命令行解析库

  1. 以文件对象监控程序为实例,五分钟实现从命令行读入多个监控目标路径;
  2. 区分两大时机,学习 CLI11 构建与解析参数两大场景下的异常处理;
  3. 区分三种选项:匿名vs.具名、选项vs.标志、必选vs.可选,全面掌握CLI11

0. 楔

本课含两段教学视频

在代码中,将关键业务数据写死,通常不是一个好做法。譬如前面课堂中基于 libwatch 所写的文件对象变动信息监控工具,用户拿到手后,就只能监控一个既定的位置:d:/tmp ,在真实工作中,这是妥妥要主动离职的节奏……

有两种常用方法用于解决类似此类的,要在运行前才能获得关键信息的问题:

  1. 命令行参数:运行程序时,通过在程序后面加参数(称为 command-line arguments)获取信息;
  2. 配置文件:程序运行后,从指定文件中读取相关配置。

这节课我们讲第1种方法,下一节课讲第2种方法,以及(真正的重点)两种方法的配合。

命令行参数和配置文件本就是为了同一个业务目标(程序运行时取得外部关键可变信息),因此,如果库本身未能支持与另一方的配合,二者的配合逻辑就只能由程序员完成。CLII很好的支持和配置文件的结合,是我们将它作为首选学习(也推荐在工作中使用)的命令行参数解析库的重要原因(甚至没有之一)。

1. 快速感受

CLI11 是一个纯头文件的库,使用起来非常方便。

纯头文件库:只有头文件,使用时只需 include 必要的头文件即可,无需事先编译库本身。缺点是:通常此类库的头文件都相对巨大,会造成目标项目每次编译时,为其耗费较长的时间。在后面的练习中,你将痛苦地感受到一点(不要问视频中为什么编译那么快,因为很多等待过程被一剪没了……)。

在 msys2 (以UCRT64环境为例)中安装 CLI11 :

pacman -S mingw-w64-ucrt-x86_64-cli11

我们以实现文件监控工具监控目标可通过命令行参数设定为案例,快速感受 CLI11 的功能与基本使用方式。

  • 视频1

007-CLI11命令行解析-1快速感受-C++108杰

  • 关键代码

加入CLI以实现从命令行读取待监控路径(支持多个)功能后,HellFSWatch 项目的主函数为:

int main(int argc, char** argv) 
{// 一、定义一个CLI::App 的变量CLI::App app("HelloFSWatch");// 二、定义需要从命令行参数读入的变量std::vector<std::string> paths;// 三、添加参数项app.add_option("paths", paths, "paths to watch"); // 四、开始解析命令行app.parse(argc, argv);if (paths.empty()){std::cerr << "paths is empty!" << std::endl;return -1;}else{for (auto const& path : paths){std::cout << path << std::endl;}}auto *monitor = fsw::monitor_factory::create_monitor(system_default_monitor_type,paths,on_file_changed);// 启动监控monitor->start();  // 进入死循环
}

这段代码能工作,但相当脆弱,用户一不小心给错参数就可能造成程序发生异常,并相当不体面地直接退出……,详细改进方法,请同学们学完下一小节 “2. 用法详解” 后,结合作业完成(完成后可提交给老师)。

2. 用法详解

在“用法详解”的视频中,我们将学习到:

  1. 异常处理:构建阶段的异常处理和解析阶段的异常处理;
  2. 匿名参数与具名参数:其中的匿名参数也称为位置参数,因为此类区分此类参数在命令行中没有名字指示,因此,最终识别它们的唯一方法,是通过它们出现在命令行中的位置加以区分;
  3. 长名字、短名字(注意,超过一个字母,就叫长名字);
  4. option 和 flag 之分;
  5. 必选和可选之分;
  6. 命令行参数与配置文件的基本配合思路。
  • 视频2

008-CLI11命令行解析-2用法详解-C++108杰

  • 代码 - CMakeLists.txt
cmake_minimum_required(VERSION 3.10.0)
project(HelloCLI11 VERSION 0.1.0 LANGUAGES C CXX)set(CMAKE_EXE_LINKER_FLAGS "-static")add_executable(HelloCLI11 main.cpp)

其中添加 “-staic” 链接选项并非必须,仅为方便在控制台(包括VSCODE集成的终端中)直接运行例程(否则,需要复制一大堆相关的动态库到程序目录下才能运行)。

  • 代码 - main.cpp
#include <cstdlib>#include <iostream>
#include <vector>
#include <string>
#include <iomanip>#include <CLI/CLI.hpp>int main(int argc, char** argv)
{std::system("chcp 65001 > nul");CLI::App app ("一个CLI11命令行参数解析的例子");std::vector<std::string> paths;int maxCount = 0;bool createdOnly = false;try{app.add_option("paths", paths, "待监控的文件夹路径(可含多个)")->required();app.add_option("--max-count,-m", maxCount, "最大消息数");app.add_flag("-c,--created-only", createdOnly, "只关注新建信息");}catch(CLI::ConstructionError const& e){return app.exit(e);}CLI11_PARSE(app, argc, argv);std::cout << "待监控的目录:\n";for (auto const& path: paths){std::cout << path << "\n";}std::cout << "max-count : " << maxCount << "\n";std::cout << "created-only: " << std::boolalpha << createdOnly << "\n";std::system("pause");
}

其中的 CLI11_PARSE 是 CLI11 提供的宏,CLI11_PARSE (app, argc, argv) 大体将对应到以下代码:

    try{app.parse(argc, argv); }catch(CLI::ParseError const& e){return app.exit(e);}

3. 知识小结

  1. 构建时期产生的异常,基类为 CLI::ConstructionError ,此类错误通常是我们在使用add_option()或add_flag()时,所配置的参数项逻辑不合理,比如:同名的参数,或者误以为可以添加名字超过一个字母的“短名字”;
  2. app.parse() 过程产生的异常,称为 “CLI::ParseError”,是一种典型的运行期异常:因为它通常由程序用户的错误造成(给出错误的命令行参数,比如,未给必选项参数),躲都没处躲,因此一定要加 try-catch 处理,为此,CLI11 干脆给了一个宏来简化处理;
  3. 再次强调:超过一个字母,就算长名字,必须在前面加两个杠 --;一个字母才是短名字,加一个杠 -;一个杠都不用加的,课程称之为 “匿名参数”,不过 CLI11 自身称之为 positionals 参数,即基于位置识别的参数;
  4. 绑定变量类型主要支持:整数、字符串、布尔值等,以及对应的动态数组(std::vector);
  5. 当绑定的变量是 std::vector 类型,CLI11 会自动帮我们尝试读入连续的参数,存放到目标 vector 对象中;
  6. 类型是布尔值时,也可以通过是否提供该参数(名字)来推理参数值:有提供为true,否则为false,使用此方法时 ,需要通过 app.add_flag() 来添加参数;
  7. 同一参数的短名称和长名称,可在指定名称时,通过逗号分隔,二者次序无关,如例程代码中的 “–max-count,-m” 以及 “-c,–created-only”;
  8. 通过级联调用 ->required() ,可将对应参数设置为必选项;
  9. CLI11 已经自动添加了 --help,-h 参数,因此我们不能再添加它们。

如何避免“看着都懂了,一要写代码就又不会”的学习困境?想想,网络学习,总是差了点什么?当然是 “作业” 呀!请到 d2school.com 网站进入本文对应的课堂,做练习并交给老师批改(可能需要花10毛)。
CLI::App d2school

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

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

相关文章

谱分析方法

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 ima 知识库 知识库广场搜索&#…

【软考-架构】11.3、设计模式-新

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 项目中的应用设计模式创建型设计模式结构型设计模式行为型设计模式 &#x1f4af;考试真题题外话 项目中的应用 在实际项目中&#xff0c;我应用过多种设计模式来解决不同…

Linux的Shell编程

一、什么是Shell 1、为什么要学习Shell Linux运维工程师在进行服务器集群管理时&#xff0c;需要编写Shell程序来进行服务器管理。 对于JavaEE和Python程序员来说&#xff0c;工作的需要。Boss会要求你编写一些Shell脚本进行程序或者是服务器的维护&#xff0c;比如编写一个…

论文阅读笔记:Deep Unsupervised Learning using Nonequilibrium Thermodynamics

1、来源 论文连接1&#xff1a;http://ganguli-gang.stanford.edu/pdf/DeepUnsupDiffusion.pdf 论文连接2(带appendix)&#xff1a;https://arxiv.org/pdf/1503.03585v7 代码链接&#xff1a;https://github.com/Sohl-Dickstein/Diffusion-Probabilistic-Models 代码的环境配置…

Linux 查看及测试网络命令

使用 ifconfig 命令查看网络接口地址 查看指定的网络接口信息 执行 ifconfig ens33 命令可以只查看网卡 ens33 的配置信息

ABAP语言的动态编程(4) - 综合案例:管理费用明细表

本篇来实现一个综合案例&#xff1a;管理费用明细表。报表在实际项目中&#xff0c;也有一定的参考意义&#xff0c;一方面展示类似的报表&#xff0c;比如管理费用、研发费用等费用的明细&#xff0c;使用业务比较习惯的展示格式&#xff1b;另一方面正好综合运用前面学习的动…

【Redis】Redis的数据删除(过期)策略,数据淘汰策略。

如果问到&#xff1a;假如Redis的key过期之后&#xff0c;会立即删除吗&#xff1f; 其实就是想问数据删除(过期)策略。 如果面试官问到&#xff1a;如果缓存过多&#xff0c;内存是有限的&#xff0c;内存被占满了怎么办&#xff1f; 其实就是问&#xff1a;数据的淘汰策略。…

Linux配置yum仓库,服务控制,防火墙

一、yum仓库 1.在安装软件时&#xff0c;首先第一步就是要考虑软件的版本的问题&#xff01; 2.软件的安装&#xff1a;最安全可靠的方法就是去软件对应的官网上查看安装手册&#xff08;包括的软件的下载&#xff09; 红帽系软件安装的常见的3种方式 &#xff08;1&#x…

设计模式(创建型)-抽象工厂模式

摘要 在软件开发的复杂世界中,设计模式作为解决常见问题的最佳实践方案,一直扮演着至关重要的角色。抽象工厂模式,作为一种强大的创建型设计模式,在处理创建一系列或相关依赖对象的场景时,展现出了独特的优势和灵活性。它通过提供一个创建对象的接口,让开发者能够在不指定…

【JavaEE】-- SpringBoot快速上手

文章目录 1. Maven1.1 什么是Maven1.2 为什么要学Maven1.3 创建一个Maven项目1.4 Maven核心功能1.4.1 项目创建1.4.2 依赖管理1.4.3 Maven Help插件 1.5 Maven仓库1.5.1 本地仓库1.5.2 中央仓库1.5.3 私有服务器&#xff08;私服&#xff09; 1.6 Maven设置国内源1.6.1 配置当前…

TCP/IP 协议精讲-精华总结版本

序言 本文旨在介绍一下TCP/IP涉及得所有基础知识&#xff0c;为大家从宏观上俯瞰TCP/IP提供一个基石&#xff0c;文档属于《TCP/IP图解&#xff08;第五版&#xff09;》的精简版本。 专业术语 缩写 全称 WAN Wide area network广域网 LAN Local area network局域网 TC…

C语言——结构体、联合、枚举

C语言中自定义类型 结构体结构体变量的创建和初始化结构体传参结构体内存对齐(如何存储) 联合体(共用体)联合体创建和初始化联合体大小(如何存储) 枚举类型枚举类型创建枚举类型初始化枚举的优点(相较于define) 前言 C语言中有内置类型和自定义类型&#xff0c;内置类型就像int…

【Linux操作系统——学习笔记二】Linux简单导航命令操作

一、前言 学习Linux&#xff0c;本质上是学习在命令行下熟练使用Linux的各类命令。 命令行&#xff1a;是一种通过输入命令和参数与计算机系统进行交互的方式&#xff0c;可以使用各种字符化命令对系统发出操作指令&#xff0c;打开Linux终端&#xff0c;进入命令行界面。 …

新安装的cursor安装不了插件

我安装的cursor版本0.47.5 直接说解决办法 找到安装路径cursor\resources\app下的product.json 修改https://marketplace.cursorapi.com为https://marketplace.visualstudio.com

HTML5扫雷游戏开发实战

HTML5扫雷游戏开发实战 这里写目录标题 HTML5扫雷游戏开发实战项目介绍技术栈项目架构1. 游戏界面设计2. 核心类设计 核心功能实现1. 游戏初始化2. 地雷布置算法3. 数字计算逻辑4. 扫雷功能实现 性能优化1. DOM操作优化2. 算法优化 项目亮点技术难点突破1. 首次点击保护2. 连锁…

Qt之自定义界面组件 一

通过qt中的painter绘图事件绘制一个电池电量图的变化。效果如下图 创建一个基于界面widget工程&#xff0c;在wdiget界面添加一个widget界面,将添加的widget界面的类提升为Tbattery.在Tbattery类中重写painEvent电池电量代码 文件目录结构 主要部分代码 //Tbattery.cpp #inc…

LeRobot源码剖析——对机器人各个动作策略的统一封装:包含ALOHA ACT、Diffusion Policy、VLA模型π0

前言 过去2年多的深入超过此前7年&#xff0c;全靠夜以继日的勤奋&#xff0c;一天当两天用&#xff0c;抠论文 抠代码 和大模型及具身同事讨论&#xff0c;是目前日常 而具身库里&#xff0c;idp3、π0、lerobot值得反复研究&#xff0c;故&#xff0c;近期我一直在抠π0及l…

数据结构篇——线索二叉树

一、引入 遍历二叉树是按一定规则将二叉树结点排成线性序列&#xff0c;得到先序、中序或后序序列&#xff0c;本质是对非线性结构线性化&#xff0c;使结点&#xff08;除首尾&#xff09;在线性序列中有唯一前驱和后继&#xff1b;但以二叉链表作存储结构时&#xff0c;只能获…

汽车保养记录用什么软件记录,汽车维修记录查询系统,佳易王汽车保养维护服务记录查询管理系统操作教程

一、概述 本实例以佳易王汽车保养维护服务记录查询管理系统为例说明&#xff0c;其他版本可参考本实例。试用版软件资源可到文章最后了解&#xff0c;下载的文件为压缩包文件&#xff0c;请使用免费版的解压工具解压即可试用。 软件特点&#xff1a;1、功能实用&#xff0c;操…

Python IP解析器 ip2region使用

说明&#xff1a;最近需要在python项目内使用IP定位所在城市的需求&#xff0c;没有采用向外部ISP服务商API请求获取信息的方案&#xff0c;则翻了翻&#xff0c;在搞Java时很多的方案&#xff0c;在Python端反而可选择范围很小。 # 示例查询 ips ["106.38.188.214"…