不知道如何使用popt库

时间:2013-03-20 16:45:55

标签: c++ c linux

所有

感谢您的帮助。

我是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 ’\0’ */
               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:错误:无法将'main(int,const char **):: poptOption *'转换为'const poptOption *'以将参数'4'转换为'poptContext_s * poptGetContext(const char *,int,const char) **,const poptOption *,unsigned int)'

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

报告此警告的原因是C语言的一个功能,但代码中的错误是由于您尝试使用popt的方式。

C中的类型(char *)和(const char *)是不同的类型。一个不是另一个,虽然C允许从一种类型到另一种类型的分配而不会爆炸,任何体面的C编译器都会给你一个警告。您可以使用类型转换来隐藏警告,但这通常是一个坏主意。

C风格的字符串属于(const char *)类型,您将其分配给poptOption中的字段descrip,该字段定义为(char *)。这会引发编译器警告,因为现在,通过遵循optionsTable数组中的引用进入该内存的人可能会尝试更改该字符串的内容。考虑到字符串被定义为常量,这是一个奇怪的事情。这就是你收到警告的原因。

您的代码中的错误是您使用自己定义的poptOption struct错误地使用了popt。如果你在第55行的the file that you include (popt.h)内查看,你会看到poptOption struct,因为它是由popt作者定义的。它是:

struct poptOption {
    /*@observer@*/ /*@null@*/ const char * longName;    /* may be NULL */
     char shortName;         /* may be '\0' */
    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; 
};

你清楚地看到即使是作者也期望(const char *),而不是你定义的(char *)。