为什么命名枚举值“IN”会导致语法错误?

问题描述 投票:1回答:1

我有一个有长度单位枚举的类。

class LengthUnit
{
public:
    enum Value
    {
        IN,
        CM,
        FT
    };
    static double convert(double value, Value from, Value to){
        if (from == to) return value;
        return value * getScale(from)/getScale(to);
    }
    constexpr LengthUnit(Value value) : value(value) {}

    bool operator==(LengthUnit lUnit) const { return value == lUnit.value; }
    bool operator!=(LengthUnit lUnit) const { return value != lUnit.value; }

private:
    static double getScale(Value value){
        switch (value){
        case IN: return 2.54; // 1 in = 2.54 cm
        case FT: return 30.48; // 1 ft = 30.48 cm
        case CM: return 1;
        default:
            throw QException();
        }
    }
    Value value;
};

在第6行检测到错误。

error: expected identifier before ',' token
         IN,
           ^

如果我将变量的名称从IN更改为INCHES,则错误消失。

导致此错误的原因是什么?据我所知,IN不是C ++或Qt的关键字,为什么名称会导致问题?

c++ enums keyword
1个回答
2
投票

您尚未指定包含的其他头文件,因此无法给出任何明确的答案。

但是,您可以执行一些操作来解决名称冲突:

  • 由于显然还有其他东西正在定义一个IN预处理器宏,你可以在你所有的#define IN whatevers之后执行:#include,看看你的编译器是否会生成描述其他地方定义的错误消息。
  • 如果这不起作用,您可以让编译器生成预处理输出(通常通过命令行选项,如-E)。然后你可以检查它,看看有什么替代IN,这可能会给你一个线索,它来自哪里。
  • 在你的源文件(.cpp.cc)中,你可以在你所有的#undef INs之后添加#include来取消定义早期的实例,因为你可能不需要早期的定义。 (不要在头文件中这样做。这样做可能会引起未来的问题。)
  • 只需重命名常量即可。正如我在评论中提到的,全大写的名称应该用于(并且仅用于)预处理器宏以避免名称冲突。不幸的是,这种做法被破坏为以全大写的方式命名常量,但我认为为预处理器宏设置一个单独的命名空间会更有用。
© www.soinside.com 2019 - 2024. All rights reserved.