C++ 不知道如何使用popt库

C++ 不知道如何使用popt库,c++,c,linux,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*

全部:

谢谢你的帮助

我不熟悉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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int argc,const char*argv[]{
char*dt1;
char*dt2;
结构定位{
常量char*longName;/*可以为空*/
char shortName;/*可以是“\0”*/
int-argInfo;
void*arg;/*取决于argInfo*/
int val;/*0表示不返回,只更新标志*/
自动帮助的char*descripp;/*说明--可能为空*/
自动帮助的char*argdescripp;/*参数说明*/
};
结构poptOption选项表[]={
{“start”、's',POPT_ARG_STRING,dt1,'s',“日期格式应为YYYY-MM-DD.”,0},
{“end”,'e',POPT_ARG_STRING,dt2,'e',“日期格式应为YYYY-MM-DD.”,0},
//~POPT_自动帮助
//~{NULL,0,0,NULL,0}
};
poptContext optCon;
optCon=poptGetContext(0,argc,argv,optionsTable,0);
const char*portname=poptgetag(optCon);

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

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

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

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

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

C样式字符串的类型为(const char*),您正在将其分配给poption中定义为(char*)的字段
descripp
。这会引发一个编译器警告,因为现在,通过跟随
options表
数组中的引用进入该内存的人可能会尝试更改字符串的内容。考虑到字符串定义为常量,允许这样做是很奇怪的。这就是为什么会出现警告

代码中的错误在于,您错误地使用了popt,使用了您自己定义的
poptotion结构
。如果查看第55行,您将看到由popt作者定义的
poptotion结构。它是:

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*)。

谢谢,Edwin,我终于发现问题在于我重新定义了struct pot选项。