gpt4 book ai didi

c++ - 为什么命名枚举值 "IN"会导致语法错误?

转载 作者:行者123 更新时间:2023-11-30 03:18:32 24 4
gpt4 key购买 nike

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

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 的关键字,那么为什么这个名称会引起问题?

最佳答案

您还没有指定还包含哪些其他头文件,因此实际上不可能给出任何明确的答案。

但是,您可以采取一些措施来解决名称冲突问题:

  • 由于显然有其他东西在定义一个 IN 预处理器宏,您可以这样做:#define IN whatever 您所有的#include 以查看您的编译器是否会生成一条错误消息,描述它在其他地方的定义。

  • 如果这不起作用,您可以让编译器生成预处理输出(通常通过命令行选项,例如 -E)。然后您可以检查它以查看用什么替换了 IN,这可能会让您了解它的来源。

  • 在您的源文件(.cpp.cc)中,您可以在所有 #undef IN 之后添加 code>#includes 取消定义较早的实例,因为您可能不需要较早的定义。 (但是,不要在头文件中执行此操作。这样做可能会引起 future 的问题。)

  • 只需重命名您的常量即可。正如我在评论中提到的,所有大写名称应该用于(并且)预处理器宏以避免名称冲突。不幸的是,这种做法被破坏为以全大写形式命名常量,但我认为为预处理器宏提供一个单独的命名空间会更有用。

关于c++ - 为什么命名枚举值 "IN"会导致语法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54660999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com