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})
解决方法
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 codeconst static obj b={1,2}
inclass A
)
编译器允许In-class initialization作为const文字类型的静态数据成员的特例.你的例子是In-class初始化.
const A :: b在每个翻译单元中定义相同的符号名称,其中包含标题,因此打破了one definition rule.
您需要将定义移动到一个且只有一个源cpp文件,以便仅定义一次.