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*) は異なる型です。1つは実際にはもう1つではなく、Cは爆発することなく1つの型から別の型への代入を許可しますが、まともなCコンパイラは警告を出します. 型キャストを使用して警告を非表示にすることはできますが、一般的にはお勧めできません。

C スタイルの文字列は (const char*) 型でありdescrip、(char*) として定義されている poptOption のフィールドに割り当てています。これにより、配列からの参照をたどってそのメモリに到達した誰かがoptionsTable文字列の内容を変更しようとする可能性があるため、コンパイラの警告が発生します。文字列が定数として定義されていることを考えると、これは奇妙なことです。そのため、警告が表示されます。

コードの間違いは、独自の定義で .popt を誤って使用していることですpoptOption structインクルードしたファイル (popt.h)の 55 行目を見ると、poptOption structpopt の作成者によって定義されている が表示されます。それは:

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

そして、作成者でさえ、あなたが定義した (char *) ではなく、(const char *) を期待していたことがはっきりとわかります。

于 2013-03-20T20:10:46.453 に答える