繁体   English   中英

应该在c ++头文件中初始化const静态变量吗?

[英]Should a const static variable be initialized in a c++ header file?

my_test.h

#ifndef MY_TEST  
#define MY_TEST

struct obj {
  int x;
  int y;
};

class A {
private:
  const static int a=100;
  const static obj b;
};

const obj A::b={1,2};

#endif

使用此头文件编译cpp时,会出现错误'multiple definition of 'A::b'

  1. 为什么我已经使用了守卫宏呢?
  2. A::a为什么不产生错误? (我不能在class A编写代码const static obj b={1,2}

为什么我已经使用了守卫宏呢?

标题保护仅阻止在同一个翻译单元中多次包含头文件内容而不是多个翻译单元。

为什么A::a没有错误信息(我不能在class A编写代码const static obj b={1,2}

编译器允许类内初始化作为const文字类型的静态数据成员的特殊情况。 你的例子是In-class初始化。

const A::b在每个翻译单元中定义相同的符号名称,其中包含标题,因此打破了一个定义规则

您需要将定义移动到一个且仅一个源cpp文件,以便仅定义一次。

Alok已经回答了你的问题,但这里有一些简单的经验法则,易于记忆:

  1. 声明放在.h文件中
  2. 定义放在.cpp文件中

因此,静态成员需要在.h文件中声明 ,然后在.cpp文件中定义 在您的情况下,修复声明的语法,然后将它们移动到“my_test.cpp”文件。

问题是你对A::b定义不包含类型。 要成为有效的定义,它应该是:

const obj A::b = {1, 2};

这将消除编译错误,但如果将此标头包含在多个源文件中,您仍会遇到链接器错误,因为A::b将被多重定义。 您应该将定义移动到.cpp文件中。

无论您是否有头文件保护,将初始化放在头文件中意味着您将在包含该头文件的每个源文件中获得A::b的实例。 因此链接器错误。

所以,一般来说,这是可能的,但不是一个好主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM