2013-03-20 45 views
0

全部:不知道如何使用弹出库

感谢您的帮助。

我是新来的C选项解析,现在,我想要的是使用popt库来解析每个参数,并prnit出来。

#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: In function ‘int main(int, const char**)’
test.cpp:27: warning: deprecated conversion from string constant to ‘char*’
test.cpp:27: warning: deprecated conversion from string constant to ‘char*’
test.cpp:30: error: cannot convert ‘main(int, const char**)::poptOption*’ to ‘const poptOption*’ for argument ‘4’ to ‘poptContext_s* poptGetContext(const char*, int, const char**, const poptOption*, unsigned int)’

回答

0

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

注意,我觉得你还需要去掉这一行:

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

谢谢!克雷格,我明白了。 – Kuan 2013-03-27 16:12:01

0

正在报告此警告的原因是C语言的一个特征,但在代码中的错误是由于你如何正试图使用​​弹出。

C中的类型(char *)和(const char *)是不同的类型。其中一个并不是真正的另一个,虽然C允许从一种类型到另一种类型但不会被炸掉,但任何体面的C编译器都会给你一个警告。您可以用类型转换来隐藏警告,但这通常是一个糟糕的主意。

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

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

struct poptOption { 
    /*@[email protected]*/ /*@[email protected]*/ const char * longName; /* may be NULL */ 
    char shortName;   /* may be '\0' */ 
    int argInfo; 
    /*@[email protected]*/ /*@[email protected]*/ void * arg;   /* depends on argInfo */ 
    int val;    /* 0 means don't return, just update flag */ 
    /*@[email protected]*/ /*@[email protected]*/ const char * descrip;  /* description for autohelp -- may be NULL */ 
    /*@[email protected]*/ /*@[email protected]*/ 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 *)你定义。

+0

谢谢,Edwin,我终于发现问题是我重新定义了struct potOption。 – Kuan 2013-03-27 16:12:36