C ++;如何在命名空间中使用全局标记

时间:2013-03-25 11:14:04

标签: c++ macros enums namespaces

我正在扩展一个定义全局TRUE和FALSE标记的现有组件。我的扩展是在新命名空间'new_namespace'中定义一个枚举'new_enum',其值为TRUE和FALSE。由于命名空间冲突,编译器无法编译它。

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

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

我希望这会得到支持......我错过了什么。

最好的问候

2 个答案:

答案 0 :(得分:8)

宏由预处理器处理,(正如其名称所示)在编译器正确之前运行。它的作用是用宏体中的文本替换宏“调用”。那么在预处理器步骤之后你的enum看起来是什么样的,以及实际编译器看到的是:

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

这不是合法的C ++,也是编译器抱怨的原因。

答案 1 :(得分:0)

Joachim已正确识别您的问题所以我不会重复这个问题。但我想评论如何解决它。没有理由将这些令牌作为定义,我强烈主张将其替换为:

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

这可能会导致类型问题,尽管它们最有可能通过隐式强制转换。如果您确实看到输入问题,请尝试以下方法:

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

无论哪种方式,这些常量都将遵循正常的范围规则,不再发生冲突。