不知道如何使用popt库
No idea how to use popt library
全部:
谢谢你的帮助。
我是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*(。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用Google Mock来模拟gettimeofday()
- 如何使用默认参数等选择模板专业化
- 为什么使用 "this" 指针调用派生成员函数?
- 使用新行和不使用新行读取文件
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 如何确定我已使用非编码文件到达 EOF?
- 使用 LLVM 的 libc++ 时,__1 符号从何而来?
- 在std::cout之后使用std::cin时,换行符从何而来
- 为什么以及在何处在C++中使用引用和指针
- 我可以读取两个值的选项在同一时间使用popt库
- 基例如何影响使用递归函数的哪些行
- 不知道如何使用popt库