ホームページ > バックエンド開発 > C++ > 文字列リテラルから `char*` への変換が C では有効であるのに、C では無効なのはなぜですか?

文字列リテラルから `char*` への変換が C では有効であるのに、C では無効なのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-15 12:25:15
オリジナル
294 人が閲覧しました

Why Are String Literal to `char*` Conversions Valid in C but Invalid in C  ?

文字列リテラルから '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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート