警告:ISO C ++は、文字列定数を 'char *'に変換することを禁止しています[-Wwrite-strings]



Warning Iso C Forbids Converting String Constant Tochar



C ++ 11で明確に指定

char* p = 'abc' // valid in C, invalid in C++

このような割り当てを行うと、コンパイラはタイトルなどの警告から飛び出します。ただし、以下に変更すると警告が出ます



char* p = (char*)'abc' //OK

またはこのように:

char const *p='abc'//OK

これは一体何なのか?実際、cまたはC ++を学習すると、操作を割り当てるときに等しい側の変数タイプが異なる場合、コンパイラーは暗黙変換と呼ばれる操作を実行して変数を割り当て可能にすることがわかります。

上記の式にはこのような問題があります。等号の右側の「abc」は不変定数であり、C ++では文字列リテラルと呼ばれ、const char *と入力し、pはcharポインタです。値を強制するとどうなりますか?そうです、右側の定数がポインターにキャストされ、その結果、const定数が変更されます。コンパイルと実行の結果は、コンパイラとオペレーティングシステムによって決定されます。一部のコンパイラは合格し、一部は例外をスローします。例外が発生した場合でも、オペレーティングシステムの機密性のために、コンパイラが強制終了される可能性があります。

このように文字列リテラルをポインタに直接割り当てる操作は、開発者によって非推奨と見なされますが、以前のコードの多くにはこの習慣があるため、互換性のために保持されています。