1. ホーム
  2. Qt

linux環境:警告。ISO C++は文字列定数を'char*'に変換することを禁じている[-Write-strings]。

2022-02-08 12:02:53

C++では

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

という警告がポップアップで表示されます。 警告を表示します。ISO C++は文字列定数を'char*'に変換することを禁じています[-Write-strings]。

以下に変更することで警告をクリアできます。

char* p = (char*)"abc"; // OK

または、以下のように変更してください。

char const *p = "abc"; // OK

理由の説明

<ブロッククオート

cやc++を勉強しているとわかるのですが、代入時に等号の両側にある変数の型が異なる場合、コンパイラは暗黙の変換というものを行って、その変数が代入できるようにするんです。

上の式の等号の右側の "abc" は不変定数で、C++ では文字列リテラルと呼ばれ、型は const char *、p は char ポインタです。無理やり代入するとどうなるのでしょうか?その通り、右の定数をポインタに強制的に型変換し、結果的にconst定数を変更していることになります。コンパイル実行の結果は、コンパイラとOSの両方が判断します。合格するコンパイラもあれば、例外を投げるコンパイラもありますし、合格してもOSの感性で殺される場合もあります。

このように文字列リテラルをポインタに直接代入するような操作は、開発者からは非推奨とされていますが、多くのコードがこの習慣を持っていたため、互換性のために保存されていることを除けば、非推奨です。