5

この宣言の何が問題になっていますか?

char *add_element[] = {"1","S"};

これをコンパイルすると、このエラーが発生します-

warning: initialization discards qualifiers from pointer target type

私は何を間違っていますか?

この質問は、 Why I get; とは異なります。タイプ「const char *」の式で「char *」を初期化すると、修飾子が破棄されますか? . これは、以下のコメントで確認できます。答えてくれてありがとう。

重複する可能性のある質問は関連していますが、同じではありません。void func(const char *ptr) { char *local = ptr; の理由についてです。... } は、ここのように初期化子を扱うのではなく、警告を引き出します。この質問は、その質問の複製として閉じられるべきではないと思います

4

1 に答える 1

9

GCC を使用しているようで、-Write-stringsオンになっています。これにより、コンパイラはまさにこの状況について警告します。文字列リテラルをconst char配列ではなくchar配列にするため、初期化でconst. 使用する:

const char *add_element[] = { "1", "S" };

またはオフにし-Wwrite-stringsます。

GCCマニュアルから:

-Wwrite-strings

C をコンパイルするときは、文字列定数に型を指定して、アドレスを非ポインターconst char[length]にコピーすると警告が発生するようにします。const char *これらの警告は、コンパイル時に文字列定数に書き込もうとする可能性のあるコードを見つけるのに役立ちますがconst、宣言とプロトタイプでの使用に十分注意している場合に限ります。そうでなければ、ただの迷惑になります。-Wallこれが、これらの警告を要求しなかった理由です。

C++ をコンパイルするとき、文字列リテラルから への非推奨の変換について警告しchar *ます。この警告は、C++ プログラムではデフォルトで有効になっています。

于 2013-02-10T16:54:07.843 に答える