声明并初始化标头中的静态int

时间:2010-08-11 15:28:53

标签: c++

如果我在头文件中有以下内容:

foo.h中

Foo
{
public:
  static const int BAR = 1234;
  ...
};

我是否还需要在.cpp中定义变量,例如:

Foo.cpp中

const int Foo::BAR;

我们遇到一个问题,即在标头中初始化静态似乎适用于MS编译器,但在Mac上使用gcc似乎会给链接器错误。

4 个答案:

答案 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;