C++ 在标头中声明和初始化静态int

C++ 在标头中声明和初始化静态int,c++,C++,如果头文件中包含以下内容: 福安 我是否还需要在.cpp中定义变量,例如: Foo.cpp const int Foo::BAR; 我们有一个问题,在MS编译器上初始化头中的静态文件似乎有效,但在Mac上使用gcc似乎会导致链接器错误。应该在头中进行声明,而初始化应该在.cpp上进行 有一篇关于静态成员变量的有趣文章。第一个片段适用于某些环境,但定义确实是某些编译器所需要的,当然,如果您使用常量的地址 如果您不想通过触摸头和体来引入常量,那么仍然存在旧的枚举技巧: class A { p

如果头文件中包含以下内容:

福安

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

Foo.cpp

const int Foo::BAR;

我们有一个问题,在MS编译器上初始化头中的静态文件似乎有效,但在Mac上使用gcc似乎会导致链接器错误。

应该在头中进行声明,而初始化应该在.cpp上进行


有一篇关于静态成员变量的有趣文章。

第一个片段适用于某些环境,但定义确实是某些编译器所需要的,当然,如果您使用常量的地址

如果您不想通过触摸头和体来引入常量,那么仍然存在旧的枚举技巧:

class A
{
   public:
       enum { someconstant=1234 };
};
使someconstant作为编译时常量可用,而无需在正文中定义。

头文件

Foo
{
public:
  static const int BAR;
  ...
};
代码文件

const int Foo::BAR = 1234;

您需要声明和定义,就像您编写它们一样

由于它是一个整数,您可以在声明中初始化它,就像您所做的那样,编译器应该在可能的情况下将其视为编译时常量。但它仍然需要在源文件中有一个(并且只有一个)定义,否则当它不能作为常量处理时,您将得到链接错误


显然,微软认为标准行为过于混乱,并“扩展”了语言,将带有初始值设定项的声明视为定义;看见如果还正确定义了符号,则会导致链接错误(多个定义的符号)。您可以通过禁用语言扩展(
/Za
)来获得标准行为。

整型常量静态成员可以在类定义中声明的位置进行初始化。这样做是一个好主意,因此在可能的情况下,它们可以被视为编译时常量。如果第一个片段始终被视为编译时常量,那么它可能单独工作。但这是一个声明,不是一个定义,省略定义是一个错误。如果您试图获取引用或指针,或者由于某种原因编译器不想将其视为编译时常量,则会出现链接错误。谢谢您指出这一点。关于静态常量int定义,我已得到更正。如果我包含第二个(.cpp)符号,则我的应用程序将不会链接到MSC下,我将获得“找到一个或多个多重定义符号”。如果我没有在标题中初始化static,那么它将链接。
const int Foo::BAR = 1234;