Brave

骤然临之而不惊 无故加之而不怒

  • 主页
  • 文章
  • 读书
  • 电影
  • 关于

Brave

骤然临之而不惊 无故加之而不怒

  • 主页
  • 文章
  • 读书
  • 电影
  • 关于

VS中命令行参数解析——cmdline

2018-02-06

在视频编码领域中,当需要利用批处理进行大规模的性能测试时,利用命令行参数传参是一个常出现的传参方法。笔者在之前的开发过程中,总是用自己写的简易版本来进行参数解析,非常粗鲁并且繁琐且容易出错。恰好最近要实现一个功能,其中第一步就需要进行命令行参数的解析,这次去github搜索了一下,找到了一个非常轻量级并且经笔者测试可以满足需求的一个开源项目。本文主要介绍这个项目的使用。

cmdline介绍

这个项目的是基于C++实现,用了大量的模板来解决需求,所以写出来的代码非常的优雅美观。贴出cmdline项目的开源地址:cmdline

cmdline使用

首先需要clone下来这个项目,在自己开发的项目里面包含cmdline项目中的cmdline.h这个头文件。
根据项目中的readme说明就可以使用这个开源库了。
汉语版本可以参考【C++】cmdline —— 轻量级的C++命令行解析库

VS下的cmdline

由于笔者的开发环境为Windows+VS,在包含头文件进来之后发现编译并不能顺利通过,提示缺少头文件cxxabi.h,而这个头文件是MSVC中不包含的。
注释掉头文件cxxabi.h的包含之后,发现只有一个错误。函数具体如下所示

1
2
3
4
5
6
7
8
static inline std::string demangle(const std::string &name)
{

int status=0;
char *p=abi::__cxa_demangle(name.c_str(), 0, 0, &status);//用到cxxabi.h中的函数
std::string ret(p);
free(p);
return ret;
}

这个是因为MSVC和其他编译器的差别造成,修改方法如下

  1. 头文件包含部分检测
1
2
3
4
//当编译器不是gcc时,不包含cxxabi.h头文件
#ifdef __GNUC__
#include <cxxabi.h>
#endif
  1. 修改函数static inline std::string demangle(const std::string &name)如下所示
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    static inline std::string demangle(const std::string &name)
    {

    #ifdef _MSC_VER
    // 为MSVC编译器时直接返回name
    return name;
    #elif defined(__GNUC__)
    // 为gcc编译器时还调用原来的代码
    int status=0;
    char *p=abi::__cxa_demangle(name.c_str(), 0, 0, &status);
    std::string ret(p);
    free(p);
    return ret;
    #else
    // 其他没有cmdline.h的编译器需要自己实现这个方法
    #endif
    }
赏

谢谢你请我吃糖果

支付宝
微信
  • C++
  • 命令行解析

扫一扫,分享到微信

微信分享二维码
产生一个随机数
© 2018 Brave
Hexo Theme Yilia by Litten