C++ 访问C++;多个源文件中的静态类成员变量
我有两门课。其中一个具有一组静态常量uint32(以下代码是一个精简示例): 由于实际的类相当大,所以我通常只对每个cpp文件执行一个类,但我遇到了一个问题。C++ 访问C++;多个源文件中的静态类成员变量,c++,compiler-errors,static-members,C++,Compiler Errors,Static Members,我有两门课。其中一个具有一组静态常量uint32(以下代码是一个精简示例): 由于实际的类相当大,所以我通常只对每个cpp文件执行一个类,但我遇到了一个问题。Foo::RunMe()和Bar::RunMeAlso()都可以访问值Foo::BAZ 我得到了constuint32\u t Foo::BAZ=1的定义在foo.cpp中,但在VS2010中的bar.cpp(它在switch语句中用作大小写标签)中遇到编译错误(虽然此代码需要可移植,但我尚未使用gcc检查)。两个头文件都包含在两个源文件中
Foo::RunMe()
和Bar::RunMeAlso()
都可以访问值Foo::BAZ
我得到了constuint32\u t Foo::BAZ=1的定义代码>在foo.cpp中,但在VS2010中的bar.cpp(它在switch语句中用作大小写标签)中遇到编译错误(虽然此代码需要可移植,但我尚未使用gcc检查)。两个头文件都包含在两个源文件中。。。试图在bar.cpp中加入某种外部引用来告诉编译器它在不同的翻译单元中并不能解决这个问题(会产生更多的编译错误)。。。当然,我在这类主题上找到的所有例子都是针对单个类/文件的小例子,在这些类/文件中,除了声明之外,还有人不知道/忘记使用定义
有人想知道如何解决这个问题吗?(我希望不必使用枚举,但如果这是唯一的其他选项,我会这样做,因为我确信它会编译!)
蒂亚
-J大小写标签必须是编译器常量。静态成员变量不是编译器常量,除非它是常量并在声明中用常量表达式初始化 因此:
- 声明它
静态常数uint32\u t BAZ=1标题中的代码>;或
- 使用
代替if
开关
顺便说一句,阅读实际的错误消息通常是有帮助的。如果你想问它的话,就把它贴出来…你到底会遇到什么错误?我想,你应该面对的是链接器错误,而不是编译器错误。您可以发布错误吗?bar.cpp中引用Foo::BAZ的代码看起来像什么?以下是错误,仅供参考:
bar.cpp(412):错误C2051:大小写表达式不是常量
。这肯定是编译器错误,而不是链接器错误。代码是(我说过它是case语句的标签):switch(somevar){case Foo::BAZ:
。我会记得下次发布错误消息,但你是对的:这是关于非常量大小写标签的。我会改为转换为if else,因为大多数时候我实际访问这些常量,switch语句只有2或3个大小写语句。谢谢你,rodrigo!实际上,rodrigo,谢谢你的帮助看在奈斯的份上,我想问你关于声明它的问题。我假设你的意思是我应该将=1
放在类中声明它的位置,而不是将定义移到标题中(因为这会导致链接器错误,对吗?)当然可以。在声明中使用常量表达式初始化的简单类型静态常量成员变量被视为编译器常量,非常类似于枚举常量或全局常量。如果不满足这些条件中的任何一个,则它是一个具有外部链接和全部链接的变量,您不应将定义放入标题。
class Foo {
public:
static const uint32_t BAZ;
void RunMe(void);
};
class Bar {
public:
void RunMeAlso(void);
};