program_options禁止命令行短参数
典型的 boost program_options的用法如下:
#include <boost/program_options.hpp> using namespace boost::program_options;
using namespace std; int main(int argc, char* argv[]) // 需要命令行参数
{
int intValue;
options_description opts("Mysql performance options"); //增加两个程序选项
opts.add_options()
("help,h", "help message")
("int", value<string>(&intValue)->default_value(), "a int value") variables_map vm; // 选项存储map容器
store(parse_command_line(argc, argv, opts), vm); //解析参数并存储到vm中 notify(vm); cout << filename << endl;
}
假设编译出的二进制文件为 test,运行 ./test --int 5。如果这时候想传入参数-5,写法应该是 ./test --int -5。由于-5与短参数格式难以分辨(-5也是短参数的格式),这时候程序依旧能够编译通过,但是运行的时候会出现参数使用错误。为了支持值为负数的参数,我们可以禁用短参数。具体做饭为将store()函数的调用改为
store(parse_command_line(argc, argv, opts,
po::command_line_style::unix_style ^ po::command_line_style::allow_short),
vm);
program_options的默认风格为unix_style, 通过 program_options官方文档 可以看到 unix_style是几种 style与的结果,我们只要使用异或的方式就可以把其中某种style去掉。
enum style_t
{
allow_long = ,
allow_short = allow_long << ,
allow_dash_for_short = allow_short << ,
allow_slash_for_short = allow_dash_for_short << ,
long_allow_adjacent = allow_slash_for_short << ,
long_allow_next = long_allow_adjacent << ,
short_allow_adjacent = long_allow_next << ,
short_allow_next = short_allow_adjacent << ,
allow_sticky = short_allow_next << ,
allow_guessing = allow_sticky << ,
case_insensitive = allow_guessing << ,
allow_long_disguise = case_insensitive << ,
unix_style = (allow_short | short_allow_adjacent
| short_allow_next | allow_long
| long_allow_adjacent | long_allow_next
| allow_sticky | allow_guessing
| allow_dash_for_short),
default_style = unix_style };
现在重新编译运行程序,运行 ./test --int -5 就可以正确输出 -5了。
program_options禁止命令行短参数的更多相关文章
- mysql命令行各个参数解释
mysql命令行各个参数解释 http://blog.51yip.com/mysql/1056.html Usage: mysql [OPTIONS] [database] //命令方式 -?, ...
- 在VS中向命令行添加参数的方法
在VS中向命令行添加参数的方法 在VS中向命令行添加参数,即向main()函数传递参数的方法: 右键单击要 添加参数的工程-->属性-->配置属性-->调试,在右侧“命令参数”栏输入 ...
- Shell Scipt 命令行带参数,输出log
命令行带参数,以及字符串参数放到ssh命令里可以这么放: #!/bin/bash 这行保证运行bash可以这样: ./data.sh if [ $# != 4 ]; then echo ...
- 记录一个 spring cloud 配置中心的坑,命令行端口参数无效,被覆盖,编码集问题无法读取文件等.
spring cloud 配置中心 结合GIT , 可以运行时更新配置文件.发送指令让应用重新读取配置文件. 最近在测试服务器实现了一套,结果CPU 实用率暴增,使用docker compose启动 ...
- 命令行传递参数并排序 AS实现加法
题目:从命令行输入参数并进行排序 1.实验准备 Integer提供了能在 int 类型和 String 类型之间互相转换的方法,还提供了处理 int 类型时非常有用的其他一些常量和方法. static ...
- 【VS工程设置】 编译动态库,命令行添加参数,不使用预编译头,指定该项目链接 哪种 运行库
编译动态库 注意: 动态库: [目标文件扩展] => .dll + [配置类型] => 动态库(.dll) 静态库: [目标文件扩展] => .lib + [ 配置类型]=> ...
- FFmpeg命令行map参数选择音视频流
FFmpeg命令行map参数选择音视频流 介绍 -map参数告诉ffmpeg要从输入源中选择/拷贝哪个stream流到输出,可以从输入源中选择多个音视频流作为输出. 不加-map参数,ffmpeg默认 ...
- python命令行获取参数
python命令行获取参数 import sys # python获取参数 input_file = sys.argv[1] output_file = sys.argv[2] print(input ...
- spring boot 项目打包后无法通过命令行传入参数
java -jar .\tk-provider.jar --spring.profiles.active=test 本想用测试环境的配置文件运行项目可项目启动时一直是使用dev配置文件运行. java ...
随机推荐
- JAVA 线程状态以及synchronized,wait,sleep,yield,notify,notifyAll
java线程存在以下几种状态: 1: 创建状态(New):线程被new出来,还未调用start 2: 就绪状态(Runnable):又称为可执行状态,调用线程的start方法后,线程处于就绪状态,,线 ...
- Java开发中文件读取方式总结
JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径. 路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:\abc\1.txt. 什么是相对路径呢?相对路 ...
- [转]Android中dp,px,sp概念梳理以及如何做到屏幕适配
http://blog.csdn.net/jiangwei0910410003/article/details/40509571 今天又开始我的App开发,因为之前一直做的是SDK,所以涉及到界面UI ...
- Android UI学习 - GridView和ImageView的使用
GridView: A view that shows items in two-dimensional scrolling grid. The items in the grid come from ...
- Android核心基础(二)
1.对应用进行单元测试 在实际开发中,开发android软件的过程需要不断地进行测试.而使用Junit测试框架,侧是正规Android开发的必用技术,在Junit中可以得到组件,可以模拟发送事件和检测 ...
- JAVA学习第四十七课 — IO流(一):文件的读写
输入流和输出流相对于内存 将外部设备的数据读取到内存中:输入 将内存中的数据写入外部设备中:输出 IO流经常使用基类 字节流的抽象基类:InputStream,OutputStream 字符的抽象基类 ...
- MySQL Replication主从复制
MySQL Replication:NySQL复制,MySQL的复制默认为异步工作模式 mysql的复制功能是mysql内置的,装上它之后就具备了这个功能,而mysql复制是mysql实现大规模高 ...
- MySQL内存体系架构及参数总结 ---图解
http://www.cnblogs.com/kissdb/p/4009614.html 内存结构: Mysql 内存分配规则是:用多少给多少,最高到配置的值,不是立即分配 图只做大概参考 全局缓存包 ...
- NSNotificationCenter消息机制的介绍
转载自http://www.cnblogs.com/pengyingh/articles/2367374.html NSNotificationCenter的作用是专门提供程序中不同类之间的消息通讯而 ...
- +load,+initialize原理
+load,+initialize原理 1.load 父类的load方法在子类load方法之前调用,分类的load方法在原来类load方法之后调用,依赖类的load方法会在自己之前调用,总之所有的类的 ...