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

Sha*_*awn 7 c++ static initialization declaration

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
Run Code Online (Sandbox Code Playgroud)

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

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

Alo*_*ave 4

当我已经使用保护宏时为什么会出现这种情况?

标头防护仅防止在同一翻译单元中多次包含标头文件内容,而不能跨多个翻译单元。

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

作为 const 文字类型的静态数据成员的特殊情况,编译器允许进行类内初始化。您的示例之一是类内初始化。

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

您需要将定义移至唯一一个源 cpp 文件,以便仅定义一次。

  • 对于OP,作为初学者,“你需要”是正确的。然而,作为绝对的技术声明,事实并非如此,因为类模板存在 ODR 豁免。这意味着从技术上讲,如果确实需要,可以在类模板中定义静态常量,然后从任意特化继承。它有时被称为模板化常量技巧。避免实现文件的一种更实用的方法(如果有的话)是通过内联函数(可以将常量作为本地常量)提供对常量的访问。 (2认同)