0

グローバルなTRUEトークンとFALSEトークンを定義する既存のコンポーネントを拡張しています。私の拡張機能は、新しい名前空間'new_namespace'内に値TRUEとFALSEを持つ列挙型'new_enum'を定義しています。名前空間の衝突のため、コンパイラはこれをコンパイルできません。

#define FALSE (0)
#define TRUE (1)

namespace new_namespace {
  class new_class {
  public :
  enum new_enum {
    TRUE = (0),
    FALSE = (1)
  };
  };
}

私はこれがサポートされていることを望んでいたでしょう...私は何かが欠けていますか?

よろしくお願いします

4

2 に答える 2

8

マクロはプリプロセッサによって処理されます。プリプロセッサは(名前が示すように)適切なコンパイラの前に実行されます。マクロ「call」をマクロ本体のテキストに置き換えます。したがってenum、プリプロセッサステップ後の外観、および実際のコンパイラの表示は次のとおりです。

enum new_enum {
    (1) = (0),
    (0) = (1)
};

これは合法的なC++ではなく、コンパイラが文句を言う理由です。

于 2013-03-25T11:17:50.993 に答える
0

Joachimはあなたの問題を正しく特定したので、答えを繰り返すことはしません。しかし、私はそれを解決する方法についてコメントしたいと思います。これらのトークンを定義する理由は実際にはありません。次のようにトークンを置き換えることを強くお勧めします。

const bool TRUE = true;
const bool FALSE = false;

これにより型の問題が発生する可能性がありますが、暗黙的にキャストすることで正常に問題が発生する可能性があります。タイピングの問題が発生した場合は、代わりにこれを試してください。

const int TRUE = 1;
const int FALSE = 0;

いずれにせよ、これらの定数は通常のスコープ規則に従い、競合しなくなります。

于 2013-03-25T11:44:24.300 に答える