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の感性で殺される場合もあります。
このように文字列リテラルをポインタに直接代入するような操作は、開発者からは非推奨とされていますが、多くのコードがこの習慣を持っていたため、互換性のために保存されていることを除けば、非推奨です。
関連
-
LNMP nginx1.4.6+php5.5.11+mysql5.6.17+mecache+opcache コンパイルとインストール+opcacheパラメータ詳細+opcacheビジュアルPHPページコード
-
mac os python3 エラー dyld: ライブラリがロードされない
-
ubuntu installationEnvironmentError: mysql_config not found エラー
-
ERR_CONTENT_LENGTH_MISMATCH 問題解決のためのハンドブック
-
find:表現上の問題と解決策の前に、道筋がなければならない
-
gcc コンパイル時にオペランドがバイナリに変換されない -解決方法
-
BadPaddingException:与えられた最終ブロックが適切にパディングされていない
-
scp error not a regular file
-
mysqlbinlog: 不明な変数 'default-character-set=utf8mb4' の問題を解決する。
-
arpa/inet.h
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Ubuntu で vs code のソースファイル "iostream" を開けない。
-
シェルスクリプト二項演算子期待値エラー
-
コマンドラインからDSOが見つからないことに遭遇した
-
エラーについて: error: 'QApplication app' variable has initializer but incomplete type
-
Makefile 実行中のエラー: make: *** xxx が必要とするターゲット ` ' を作成するためのルールがありません。
-
413 リクエストエンティティが大きすぎる問題の解決策
-
scpコマンドが通常のファイルでないことを報告する問題の解決法
-
linuxのセグメンテーション障害
-
Ubuntu 20.04 プロキシ設定
-
elasticsearchを解決する。例外 BindTransportException [9300-9400]へのバインドに失敗しました]。