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(1), "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 =  1,
    allow_short =  allow_long << 1,
    allow_dash_for_short =  allow_short << 1,
    allow_slash_for_short =  allow_dash_for_short << 1,
    long_allow_adjacent =  allow_slash_for_short << 1,
    long_allow_next =  long_allow_adjacent << 1,
    short_allow_adjacent =  long_allow_next << 1,
    short_allow_next =  short_allow_adjacent << 1,
    allow_sticky =  short_allow_next << 1,
    allow_guessing =  allow_sticky << 1,
    case_insensitive =  allow_guessing << 1,
    allow_long_disguise =  case_insensitive << 1,
    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了。

时间: 2024-08-28 18:39:21

program_options禁止命令行短参数的相关文章

使用getopt函数对命令行短形参进行处理

今天,在看man 9 style时见到了用来处理命令行短形参getopt函数,很是诧异 -- 要知道,我处理命令行参数都是用手动的!于是我如获至宝,赶紧学习学习.getopt的原型被放在unistd.h中,它的原型是这样的:int getopt(int argc, char * const argv[], const char *optstring)这里的argc,argv就是main函数的形参,需要调用是只要把main形参给传过去就ok了.后面的optstring是一个集合,包括了所有可能的短

记录一个 spring cloud 配置中心的坑,命令行端口参数无效,被覆盖

spring cloud 配置中心 结合GIT , 可以运行时更新配置文件.发送指令让应用重新读取配置文件. 最近在测试服务器实现了一套,结果CPU 实用率暴增,使用docker compose启动 restart always 多节点的服务一直重启关闭重启关闭. 日志文件记录了一个异常: 国内国外搜了一遍都没有解决 org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean wit

go语言 从命令行获取参数解析

go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单. os.Args 如果你只是简单的想要获取命令行参数,可以像下面的示例代码一样使用os.Args来获取命令行参数 package main import "fmt" import "os" func main(){ if len(os.Args)>0 { for index , value := range os.Args { fmt.Println(index, value

Java 命令行运行参数大全

Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOME"bin"java –option 来启动,-option为虚拟机参数,JAVA_HOME为JDK安装路径,通过这些参数可对虚拟机的运行状态进行调整,掌握参数的含义可对虚拟机的运行模式有更深入理解. 一.         查看参数列表:虚拟机参数分为基本和扩展两类,在命令行中输入JAVA_HOME"bin"java 就可得到基本参数列表,在命令行输入J

linux命令行传递参数定期执行PHP文件

最近在做一个项目,需要在linux下传递参数定期执行PHP文件,网上查询资料,确实有相关资料,现整理如下: 1.linux执行PHP文件 #{PHP安装bin路径} {PHP文件路径} {需要参数1 参数2 参数3}#各参数之间,用空格分开#查看php安装bin路径 可执行which php命令 /usr/bin/php /local/www/index.php 111 222 333 2.接收参数 一般情况下,php接收命令行传递过来的参数,$argv保存所有参数组成的数组,$argc保存参数

mysql命令行各个参数解释

http://blog.51yip.com/mysql/1056.html Usage: mysql [OPTIONS] [database]   //命令方式 -?, --help          //显示帮助信息并退出 -I, --help          //显示帮助信息并退出 --auto-rehash       //自动补全功能,就像linux里面,按Tab键出提示差不多,下面有例子 -A, --no-auto-rehash  //默认状态是没有自动补全功能的.-A就是不要自动补

Java命令行执行参数中包含空格被截断的问题解决

使用java -jar命令在命令行执行jar包,传入参数时,参数包含空格,例如“hello world”,这个参数会被解析成两个参数“hello”和“world”.这样的结果是执行时不能正常的获取参数.这时只要在参数两边加上引号即可. 一开始使用的命令如下:java -jar Test.jar %{test}   —— %{test}为其他程序中传入的参数 修改之后的命令如下:java -jar Test.jar ‘%{test}‘  这样就可以作为一个参数获取值了

php解释命令行的参数

php cli模式下,可以用$argc, $argv来读取所有的参数以及个数,如: [email protected]:~/php/php1/1$ cat go1 #!/usr/bin/php <?php echo '参数个数:' . $argc . PHP_EOL; echo '打印参数:' . PHP_EOL; print_r( $argv ) . PHP_EOL; 给文件加上可执行权限: [email protected]:~/php/php1/1$ ls -l total 8 -rwxr

apollo命令行传入参数

Java apollo客户端运行配置 需要在META-INF中创建app.properties文件,以配置app.id 还需要在/opt/settings/server.properties或C:/opt/settings/server.properties 为实现通过命令行参数传入控制这些参数,可以在main方法中加入以下代码: boolean isLocal = false; if (args != null && args.length > 0) { for (String a