我正在扩展一个定义全局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)
};
};
}
我希望这会得到支持......我错过了什么。
最好的问候
答案 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;
无论哪种方式,这些常量都将遵循正常的范围规则,不再发生冲突。