0

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

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

此致

4

2 回答 2

8

宏由预处理器处理,它(顾名思义)在编译器之前运行。它所做的是将宏“调用”替换为宏正文中的文本。所以你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 回答