C++ 不知道如何使用popt库
全部: 谢谢你的帮助 我不熟悉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*
#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选项。