所有
感谢您的帮助。
我是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)'
答案 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 *)。