3

C で #define を使用してキーワードを再定義できますか?

私はC++標準でこれを見つけました:

ISO/IEC 14882:1998 および ISO/IEC 14882:2003

17.4.3.1.1 マクロ名 [lib.macro.names]

2 ヘッダーを含む翻訳単位には、そのヘッダーで宣言または定義された名前を定義するマクロを含めてはなりません。また、そのような翻訳単位は、語彙的にキーワードと同一の名前のマクロを定義してはなりません。

164) #undef ディレクティブを使用してライブラリ マクロ定義を削除することは許可されていません。

ISO/IEC 14882:2011

17.6.4.3.1 マクロ名 [macro.names]

2 翻訳単位は、キーワード、表 3 にリストされている識別子、または 7.6 で説明されている属性トークンと字句的に同一の #define または #undef 名を使用してはなりません。

つまり、C++98 / C++03 では、標準 C++ ライブラリのヘッダー ファイルをインクルードするとキーワードを再定義できませんが、C++11 ではどの翻訳単位でも再定義できませんよね?

4

3 に答える 3

3

あなたはできる?はい、ほとんどのコンパイラは強制的にそれを防ぎません。

あなたはすべきですか?いいえ、(ほとんど)決して、それは(通常)恐ろしい考えです. あらゆる種類のものが壊れる可能性があり、ほとんどのプリプロセッサのナンセンスと同様に、デバッグが非常に困難になります。

したがって、合法的にできますか?いいえ。

同じように、名前空間やその他のあらゆる種類の非常に悪いもので始まる、または名前空間に何かを追加するマクロまたは変数を持つことができます。ただし、このようなほとんどのルールには、非常に正当な理由があります (ほとんどの場合、キーワードまたは名前解決に関連する競合)。物理的には可能かもしれませんが、必要な場合はほとんどなく、必要な場合もさらに少なくなります__std::

于 2012-09-05T17:27:40.087 に答える
2

C 標準では、許可されていません。

C11、§ 6.4.1 キーワード

[...]

上記のトークン (大文字と小文字を区別) は、キーワードとして使用するために (翻訳フェーズ 7 および 8 で) 予約されており、それ以外で使用してはなりません。

于 2012-09-05T17:28:38.190 に答える
1

この問題にはいくつかの側面があります。

  • キーワードを再定義する場合、95% のコンパイラでは、標準に何が書かれているかに関係なく、問題なく動作します。これは主に、これが古いコンパイラで機能していたためです。
  • これがコンパイラの次のバージョンで機能することを確信することはできません。
  • 実用的な観点から、これは避けるべきです。コードは読みにくく、理解しにくくなります。

結論: 本当にこれが必要ですか? あなたは何を手に入れますか?

tryps -catchがさまざまなヘッダーで再定義されているのを何度か見ました。

于 2012-09-05T17:30:39.403 に答える