如果我在头文件中有以下内容:
foo.h中
Foo
{
public:
static const int BAR = 1234;
...
};
我是否还需要在.cpp中定义变量,例如:
Foo.cpp中
const int Foo::BAR;
我们遇到一个问题,即在标头中初始化静态似乎适用于MS编译器,但在Mac上使用gcc似乎会给链接器错误。
答案 0 :(得分:5)
您需要声明和定义,就像您编写它们一样。
因为它是一个整数,你可以像在你做的那样在声明中初始化它,并且编译器应该尽可能地将它作为编译时常量。但是它仍然需要源文件中的一个(且只有一个)定义,否则当它不能被视为常量时,你会得到链接错误。
显然,微软认为标准行为过于混乱,并且“扩展”了语言来处理以初始化者作为定义的声明;见this issue。结果是,如果还正确定义了符号,则会出现链接错误(乘以定义的符号)。您可以通过禁用语言扩展程序(/Za
)来获取标准行为。
答案 1 :(得分:1)
第一个片段适用于某些环境,但某些编译器确实需要这个定义,当然如果你获取常量的地址。
如果你不喜欢触及标题和正文以引入常量,那么还有旧的枚举技巧:
class A
{
public:
enum { someconstant=1234 };
};
使someconstant可用作编译时常量,而无需在正文中定义。
答案 2 :(得分:0)
声明应在标题中完成,初始化应在.cpp
上完成有一篇关于静态成员变量here的有趣文章。
答案 3 :(得分:0)
头文件
Foo
{
public:
static const int BAR;
...
};
代码文件
const int Foo::BAR = 1234;