【问题标题】:C++; How to use a Global token within a namespaceC++;如何在命名空间中使用全局令牌
【发布时间】:2013-03-25 11:14:03
【问题描述】:

我正在扩展定义全局 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)
  };
  };
}

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

最好的问候

【问题讨论】:

  • 宏替换后,您的enum 现在是:enum new_enum { (1) = (0), (0) = (1) };
  • 另外,您在enum 中的值周围加上括号这一事实让我认为您认为enums 就像宏。那里绝对不需要括号。

标签: c++ macros enums namespaces


【解决方案1】:

宏由预处理器处理,它(顾名思义)在编译器之前运行。它的作用是将宏“调用”替换为宏正文中的文本。那么你的enum 在预处理器步骤之后的样子,以及实际编译器看到的,是:

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

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

【讨论】:

    【解决方案2】:

    Joachim 已正确识别出您的问题,因此我不会重复回答。但我想评论如何解决它。确实没有理由将这些标记作为定义,我强烈建议像这样替换它们:

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

    这可能会导致类型问题,尽管它们很可能会通过隐式强制转换来优雅地进行。如果您确实看到输入问题,请尝试以下操作:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 2012-12-26
      • 2011-01-02
      • 2011-01-13
      相关资源
      最近更新 更多