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

wid*_*dgg 0 c++ g++

所以,我仍在研究这个大项目,以便在Linux上进行编译.所以,再次,我得到一些不应该允许存在的错误.

这是我得到的一些错误:

(1) error: expected identifier before numeric constant
(2) error: "Value" doesn't name a type
Run Code Online (Sandbox Code Playgroud)

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

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
};
Run Code Online (Sandbox Code Playgroud)

此外,该段代码在项目的某些部分有效.但它不在其他部分.我做了一切,我重命名的东西,以确保它不含糊,不改变任何东西.

坚持GCC 4.1.2

Ada*_*wen 7

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

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

#define V1 42
Run Code Online (Sandbox Code Playgroud)

最快的解决方案是

#undef V1
Run Code Online (Sandbox Code Playgroud)

虽然,如果有人已经足够恶意来#define V1,然后我感觉到了类似的定义V2,并V3在你的未来.根据我的个人经验windows.h,许多X11标题广泛负责引入这些预处理器定义.

我想提供有关跟踪违规标题的建议,但我通常会使用grep和/或查看哪些标题会在删除时将错误消除.

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

  • 最小化包含违规标题的位置数 - 并且永远不要将其包含在头文件中.
  • 创建一个"安全"包装器头,它包含#undef所有违规常量,并在必要时用更合理的东西替换它们.