1. ホーム
  2. C++

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

2022-02-08 22:50:06
<パス

これは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定数を変更していることになります。コンパイル実行の結果は、コンパイラとOSの両方が判断します。パスするコンパイラもあれば、例外を投げるコンパイラもありますし、パスしてもOSの感性で殺される場合もあります。
 文字列リテラルをポインタに直接代入するこのような操作は、開発者によって非推奨とされています。