使用getopt_long来解析参数的小函数模板

getopt_long原型

#define no_argument        0
#define required_argument  1
#define optional_argument  2

struct option {
   const char *name;   //名称,下面实例中使用的--help,--version
   int has_arg;        //是否有参数,可选0,1,2三个值,就是上面的那三个宏定义
   int *flag;          //返回值,传入的一个int指针,表示该参数的解析结果,如果是NULL,那么返回值就会被写到getopt_long的返回值中。
   int val;            //name的简写
};

#include <unistd.h>

int getopt(int argc, char * const argv[],const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;

#include <getopt.h>
    int getopt_long(int argc, char * const argv[],
    const char *optstring,
    const struct option *longopts,
    int *longindex);

int getopt_long_only(int argc, char * const argv[],
    const char *optstring,
    const struct option *longopts,
    int *longindex);

optstring就是下面程序中的:"hva:b:",就是那一群简写集合,后面带冒号意思(比如-a)就是这个-a后面要加参数。

getopt_long实例

经常为了写小程序的解析参数感觉麻烦,所以就写一个小函数模板以后复制用。

#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

int discovery_options(int argc, char** argv, bool& show_help, bool& show_version,string& input)
{
    int ret = 0;

    static option long_options[] = {
        {"help", no_argument, &ret, ‘h‘},
        {"version", no_argument, 0, ‘v‘},
        {"arga", required_argument , 0, ‘a‘},
        {"argb", required_argument , 0, ‘b‘},
        {0, 0, 0, 0}
    };

    int opt = 0;
    int option_index = 0;
    while((opt = getopt_long(argc, argv, "hva:b:", long_options, &option_index)) != -1){
        switch(opt){
        case ‘h‘:
                show_help = true;
                break;
        case ‘v‘:
                show_version = true;
                break;
        case ‘a‘:
                input = optarg;
                break;
        case ‘b‘:
                input = optarg;
                break;
            default:
                show_help = true;
                break;
        }
    }
    // check values

    return ret;
}

void help(char** argv){
    printf("%s, Copyright (c) 2013-2015 BuguTian\n", argv[0]);
    printf(""
        "Usage: %s <Options> <-a REQUEST>\n"
        "-h no arg,mean help\n"
        "-v no arg,mean version\n"
        "-a arga\n"
        "-b argb\n",
        argv[0]);

    exit(0);
}
void version()
{
    printf("V1.1.1\n");
    exit(0);
}

int main(int argc, char** argv){
    int ret = 0;
    bool show_help = false;
    bool show_version = false;
    string input="";
    if((ret = discovery_options(argc, argv, show_help, show_version, input))){
        printf("discovery options failed. ret=%d", ret);
        return ret;
    }
    if(show_help){
        help(argv);
    }
    if(show_version){
        version();
    }
    printf("running...\n");
    return 0;
}
时间: 2024-10-10 10:35:02

使用getopt_long来解析参数的小函数模板的相关文章

C++11 函数模板的默认模板参数

类模板:通用的类描述(使用泛型来定义类),进行实例化时,其中的泛型再用具体的类型替换. 函数模板:通用的函数描述(使用泛型来定义函数),进行实例化时,其中的泛型再用具体的类型替换. [1]C++98标准中两者的区别 函数模板和类模板在C++98标准中一起被引入,两者区别主要在于: 在类模板声明时,标准允许其有默认模板参数.而函数模板却不支持. 默认模板参数的作用如同函数的默认形参.不过在C++11中,这一限制已经被解除了,如下例所示: 1 void DefParm(int m = 3) {} /

函数模板

函数模板 函数模板是那些被参数化的函数,它们代表的是一个函数家族. 初探函数模板 函数模板提供了一种函数行为,该函数行为可以用多种不同的类型进行调用:也就是说,函数模板代表一个函数家族.它的表示(即外形)看起来和普通的函数很相似,唯一的区别是函数元素是未确定的:这些元素将在使用时被参数化. 定义模板 下面是一个返回两个值中最大者的函数模板: template <typename T> inline T const& max(T const &a,T const &b)

C++(函数模板的使用)

函数模板可以用来创建一个通用的函数,以支持多种不同形参,避免重载函数的函数体重复设计.它的最大的特点就是吧函数实用的数据类型作为参数. 定义函数模板的一般形式为: template<typename T> 或者 template<class T> 1下面我们来试着用函数重载来定义不同类型的函数 int: int int_add(int a,intb) { int c; c = a + b; return c; } double: double double_add(double a

C++泛型编程之函数模板

泛型语义 泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意.泛型编程的代表作品 STL 是一种高效.泛型.可交互操作的软件组件. 泛型编程最初诞生于 C++中,目的是为了实现 C++的 STL(标准模板库).其语言支持机制就是模板(Templates). 模板的精神其实很简单:类型参数化(type parameterized),即,类型也是一种参数,也是一种静多态. 换句话说, 把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数. 函

php小经验:解析preg_match与preg_match_all 函数

php小经验:解析preg_match与preg_match_all 函数 本篇文章是对php中的preg_match函数与preg_match_all函数进行了详细的分析介绍,需要的朋友参考下 正则表达式在 PHP 中的应用在 PHP 应用中,正则表达式主要用于:•正则匹配:根据正则表达式匹配相应的内容•正则替换:根据正则表达式匹配内容并替换•正则分割:根据正则表达式分割字符串在 PHP 中有两类正则表达式函数,一类是 Perl 兼容正则表达式函数,一类是 POSIX 扩展正则表达式函数.二者

如何使用getopt()函数解析参数

最近在写程序的过程中,把一部分时间都花费在程序对参数的处理上.今天听了学长说到getopt函数,才发现原来c里面还有一个专门解决参数处理的函数,查询了相关资料,这里简单总结一下. 使用int main( int argc, char *argv[] )(或int main( int argc, char **argv ))时,系统将把用户输入的参数通过argc和argv引入程序中,argc为参数的个数,argv是指向参数的指针数组,其中第一个参数为自身程序文件名. 这里我们使用getopt() 

python若干小函数的使用

preface:一些python的小函数,好像挺方便的,记录下来. #coding:utf-8 #------------------- #split()的maxsplit()参数,第二个参数数值,代表着对前多少个分隔符进行分裂. print 'hello,world,foo,bar'.split(',',2) #['hello', 'world', 'foo,bar'] #------------------- #当遍历的时候,用enumerate()同时获得元素和下标.第二个参数数值表示从该

Google Test(GTest)使用方法和源码解析——参数自动填充技术分析和应用

在我们设计测试用例时,我们需要考虑很多场景.每个场景都可能要细致地考虑到到各个参数的选择.比如我们希望使用函数IsPrime检测10000以内字的数字,难道我们要写一万行代码么?(转载请指明出于breaksoftware的csdn博客) EXPECT_TRUE(IsPrime(0)); EXPECT_TRUE(IsPrime(1)); EXPECT_TRUE(IsPrime(2)); ...... EXPECT_TRUE(IsPrime(9999)); 这种写法明显是不合理的.GTest框架当然

不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 函数重载 缺省参数 内联函数 函数模板 示例1.函数重载, 缺省参数CppFunction1.h #pragma once #include <string> using namespace std; namespace NativeDll { class CppFunction1 { public: string Demo(); }; } CppFunction1.cpp /* * 函数重载,缺省参数