不知道如何使用popt库

No idea how to use popt library

本文关键字:popt 何使用 不知道      更新时间:2023-10-16

全部:

谢谢你的帮助。

我是C选项解析的新手,目前,我想要的是使用popt库来解析每个参数并将它们分解出来。

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <popt.h>
    using namespace std;
    int main(int argc, const char* argv[]){
        char* dt1;
        char* dt2;
        struct poptOption {
               const char * longName; /* may be NULL */
               char shortName;        /* may be ’’ */
               int argInfo;
               void * arg;            /* depends on argInfo */
               int val;               /* 0 means don’t return, just update flag */
               char * descrip;        /* description for autohelp -- may be NULL */
               char * argDescrip;     /* argument description for autohelp */
            };
        struct poptOption optionsTable[]={
            {"start",'s',POPT_ARG_STRING,dt1,'s',"The date format should like YYYY-MM-DD.",0},
            {"end",'e',POPT_ARG_STRING,dt2,'e',"The date format should like YYYY-MM-DD.",0},
            //~ POPT_AUTOHELP
            //~ {NULL,0,0,NULL,0}
            };
        poptContext optCon;
        optCon = poptGetContext (0, argc, argv, optionsTable, 0);
            const char* portname = poptGetArg(optCon);
        cout<<portname<<endl;
        return 0;
}

当我编译它时,我得到了错误llike:

test.cpp:在函数"int main(int,const char**("中
test.cpp:27:警告:不赞成从字符串常量转换为"char*">
test.cpp:27:警告:不赞成从字符串常量转换为"char*">
test.cpp:30:错误:无法将参数"4"的"main(int,const char**(::poptOption*"转换为"const poptOption*",将其转换为"poptContext_s*poptGetContext(const char*,int,const char**,const popt Option*,unsigned int(">

我认为您不应该在程序中定义结构poptOption。应该在popt-include文件中为您定义该结构。请尝试删除该结构定义。

注意,我认为您还需要取消注释这一行:

    //~ {NULL,0,0,NULL,0}

报告此警告的原因是C语言的一个特性,但代码中的错误是由于您试图使用popt的方式造成的。

C中的类型(char*(和(const-char*(是不同的类型。一个并不是真正的另一个,虽然C允许从一种类型到另一种类型的赋值而不会出错,但任何像样的C编译器都会给你一个警告。您可以使用类型转换隐藏警告,但这通常是个坏主意。

C样式字符串的类型为(const char*(,您将其分配给poptOption中的字段descrip,该字段定义为(char*(。这会引发编译器警告,因为现在,通过跟随optionsTable数组中的引用进入该内存的人可能会试图更改字符串的内容。考虑到字符串被定义为常量,允许这样做是很奇怪的。这就是你收到警告的原因。

代码中的错误是您错误地使用了popt,使用了您自己的poptOption struct定义。如果您查看第55行包含的文件(popt.h(,您将看到由popt作者定义的poptOption struct。它是:

struct poptOption {
    /*@observer@*/ /*@null@*/ const char * longName;    /* may be NULL */
     char shortName;         /* may be '' */
    int argInfo;
     /*@shared@*/ /*@null@*/ void * arg;          /* depends on argInfo */
    int val;                /* 0 means don't return, just update flag */
     /*@shared@*/ /*@null@*/ const char * descrip;       /* description for autohelp -- may be NULL */
    /*@shared@*/ /*@null@*/ const char * argDescrip;    /* argument description for autohelp */
};

或删除评论

struct poptOption {
    const char * longName;
    char shortName;
    int argInfo;
    void * arg;        
    int val;              
    const char * descrip;   
    const char * argDescrip; 
};

您可以清楚地看到,即使是作者也期望得到一个(constchar*(,而不是您定义的(char*(。