C プリプロセッサ #define を使用したキーワードの再定義
C 標準で #define を使用して言語キーワードを再定義することの有効性をめぐる激しい議論が頻繁に巻き起こりました。論争。この記事は、この議論の多い問題に光を当てることを目的としています。
C 標準 (§17.4.3.1.1/2) に従って、プリプロセッサ マクロは、標準ライブラリ ヘッダーで宣言または定義された名前を再定義できません。さらに、標準ヘッダーを含む翻訳単位内の C キーワードと字句的に同一のマクロの再定義も禁止されています。
ただし、C では、ルールが明らかに変更されています。 C 0x ドラフト (FCD §17.6.3.3.1) では、#define または #undef を使用したキーワードの再定義を明示的に禁止しています。この動きは、プリプロセッサを使用してキーワードを操作すると、予測できない動作や標準違反の可能性があるという共通認識と一致しているように見えます。
それにもかかわらず、「翻訳単位は #define または #undef をしてはならない」という記述は注目に値します。キーワードと語彙的に同一の名前」は、その後、最終的な C 11 標準で改訂されました。新しい文言 (ISO/IEC 14882:2011 §17.6.4.1/4) は次のようになります。「翻訳単位は、キーワードと字句的に同一の名前に対してマクロを定義してはならない。」
この改訂版は、完全な禁止を示唆しているようです。 #define を使用したキーワードの再定義は標準から削除されました。ただし、標準ヘッダーで宣言または定義された名前の再定義の禁止は引き続き適用されます (ISO/IEC 14882:2011 §17.6.4.1/6)。
この進行中の議論を考慮すると、次の場合は注意することをお勧めします。 C プログラムで言語キーワードを再定義しようとしています。特定の条件下では技術的には可能かもしれませんが、そのような行為を行うと、プログラムとさまざまなコンパイラやツールチェーンとの互換性が損なわれる可能性があります。一般に、標準を遵守し、プリプロセッサ マクロやユーザー定義型などの代替メカニズムを使用することが、より安全なアプローチであると考えられています。
以上が#define プリプロセッサを使用して C キーワードを再定義できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。