0

所以,我仍然在做这个大项目,让它在 Linux 上编译。所以,再次,我得到了一些不应该存在的错误。

这是我得到的一些错误:

(1) error: expected identifier before numeric constant
(2) error: "Value" doesn't name a type

这是一段简化的示例代码,它向您展示了我在哪里得到这些错误:

class Test
{
public:
  enum Value
  {
    V1 = 0,  // error (1) is here
    V2 = 1,
    V3 = 2
  };

private:
  Value value; // error (2) is here

public:
  // constructor and other function
};

此外,那段代码在项目的某些部分是有效的。但它不是在其他部分。我做了所有事情,我重命名了一些东西以确保它没有歧义,不会改变任何东西。

卡在 GCC 4.1.2

4

1 回答 1

7

该片段可以使用 g++ 4.4.3 编译,我希望它也可以使用 g++ 4.1.2 编译。

您遇到的原因是使用#definefor 常量在 C++ 中是一件根本邪恶的事情。您包含的头文件之一包含如下行:

#define V1 42

最快的解决方案是

#undef V1

但是,如果有人足够恶意,#define V1那么我会为您的未来V2V3您的未来感到类似的定义。根据我的个人经验windows.h,许多 X11 标头都广泛负责引入此类预处理器定义。

我想提供有关跟踪违规标头的建议,但我通常求助于 grep 和/或查看哪些标头在删除时使错误消失。

当我们遇到这个问题时,我们的一般做法是

  • 尽量减少包含违规标头的位置数量 - 并且永远不要将其包含在标头文件中。
  • 创建一个“安全”的包装标头,#undef其中包含所有有问题的常量,并在必要时用更合理的东西替换它们。
于 2012-05-24T14:27:38.623 回答