所以,我还在研究这个大项目,以便在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
答案 0 :(得分:7)
这个片段用g ++ 4.4.3编译得很好,我希望它也能用g ++ 4.1.2编译好。
你遇到的是使用#define
作为常量的原因在C ++中是一件非常邪恶的事情。您包含的其中一个标题文件包含以下行:
#define V1 42
最快的解决方案是
#undef V1
但是,如果某人的恶意程度足以#define V1
,那么我将来会感受V2
和V3
的类似定义。根据我的个人经验windows.h
,许多X11标题广泛负责引入类似这些的预处理器定义。
我想提供关于跟踪违规标题的建议,但我通常会使用grep和/或查看哪些标题会在删除后消失。
当我们遇到这个问题时,我们的一般做法是
#undef
所有违规的常量,并在必要时用更合理的东西替换它们。