0

全部:

感谢帮助。

我是 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;
}

当我编译它时,我得到了类似的错误:

test.cpp:在函数 'int main(int, const char**)'<br> test.cpp:27:警告:不推荐将字符串常量转换为 'char*'<br> test.cpp:27:警告:不推荐将字符串常量转换为 'char*'<br> test.cpp:30: 错误:无法将参数 '4' 的 'main(int, const char**)::poptOption*' 转换为 'const poptOption*' 'poptContext_s* poptGetContext(const char*, int, const char**, const poptOption*, unsigned int)'</p>

4

2 回答 2

1

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

请注意,我认为您还需要取消注释此行:

    //~ {NULL,0,0,NULL,0}
于 2013-03-20T19:52:04.050 回答
0

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

C 中的类型 (char*) 和 (const char*) 是不同的类型。一个不是另一个,虽然 C 允许从一种类型分配到另一种类型而不会崩溃,但任何体面的 C 编译器都会给你一个警告。您可以使用类型转换隐藏警告,但这通常不是一个好主意。

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

您的代码中的错误是您错误地使用了 popt,并使用了您自己定义的poptOption struct. 如果您在第 55 行包含的文件 (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 *)。

于 2013-03-20T20:10:46.453 回答