没有任何意义的另一个g ++编译错误

时间:2012-05-24 14:13:45

标签: c++ g++

所以,我还在研究这个大项目,以便在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

1 个答案:

答案 0 :(得分:7)

这个片段用g ++ 4.4.3编译得很好,我希望它也能用g ++ 4.1.2编译好。

你遇到的是使用#define作为常量的原因在C ++中是一件非常邪恶的事情。您包含的其中一个标题文件包含以下行:

#define V1 42

最快的解决方案是

#undef V1

但是,如果某人的恶意程度足以#define V1,那么我将来会感受V2V3的类似定义。根据我的个人经验windows.h,许多X11标题广泛负责引入类似这些的预处理器定义。

我想提供关于跟踪违规标题的建议,但我通常会使用grep和/或查看哪些标题会在删除后消失。

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

  • 最大限度地减少包含违规标题的地点数量 - 并且绝不会将其包含在标题文件中。
  • 创建一个“安全”的包装器标头#undef所有违规的常量,并在必要时用更合理的东西替换它们。