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

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时,会出现错误’A :: b’的多重定义.

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

解决方法@H_404_11@

why is this when I have been using guard macro already?

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

why is A::a does not have the error message (I can’t write code const static obj b={1,2} in class A)

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

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

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

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...