文字列リテラルから 'char*' への変換が C では有効であるのに C では無効である理由
C の § C.1.1 11 標準 (ISO/IEC 14882:2011)、割り当て char* p = "abc"無効と宣言されます。ただし、この変換は C ではまだ有効です。なぜこのようなことになるのでしょうか?
暗黙的な変換は C では非推奨です
C 03 までの C バージョンでは、からの変換は「char*」の文字列リテラルは、非推奨ではありましたが、有効でした。文字列リテラルは、未定義の動作なしに内容を変更できないため、「char const *」として扱う必要があります。
明示的な変換は引き続き有効です
暗黙的な変換は非推奨になりましたがC 11 では、明示的な変換は引き続き有効です。コードをコンパイルするには、キャストを追加できます: char* p = (char*)"abc".
キャストの欠点
ただし、この明示的な変換はコードを「修正」しません。これは単にコンパイラが割り当てを受け入れることを許可するだけです。文字列リテラルの変更に関する潜在的な問題は依然として存在します。
解決策: 正しい型を使用します
文字列リテラルを処理する適切な方法は、正しい型 ' を使用することです。 char const *': char const *p = "abc"。このアプローチは、C と C の両方で有効かつ安全です。
C での正当性
かなりの量の既存のコードが C に依存しているため、変換は C でも引き続き有効です。 。適切な警告なしにこのコードを破ることは、標準委員会によって望ましくないと考えられました。
以上が文字列リテラルから `char*` への変換が C では有効であるのに、C では無効なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。