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'
发生。
- 这是为什么时,我一直在用后卫宏了吗?
- 为什么
A::a
无法产生埃罗? (我不能写代码const static obj b={1,2}
在class A
)
这是为什么时,我一直在用后卫宏了吗?
头警卫只能防止夹杂物的头文件的内容不只一次在同一更多翻译单元不会在多个翻译单元。
为什么是A::a
不具有错误消息(我不能写代码const static obj b={1,2}
在class A
)
在级初始化是由编译器允许作为常量文本类型的静态数据成员的一个特例。 你举的例子之一是在类的初始化。
const A::b
在其中报头被包括在每个转换单元定义了相同的符号名称,并因此破坏了一个定义规则 。
您需要定义移动到一个且只有一个源cpp文件,以便它被定义一次。
阿洛克已经回答了你的问题,但这里有经验的几个简单的规则,易于记忆的形式:
- 声明在.h文件中
- 定义走在.cpp文件
因此,静态成员需要在.h文件中声明 ,然后在.cpp文件中定义的 。 在你的情况,定出声明的语法,然后将它们移到“my_test.cpp”文件。
问题是你定义A::b
不包含类型。 要成为一个有效的定义,它应该是:
const obj A::b = {1, 2};
这将摆脱编译错误的,但你仍然会得到链接错误,如果你有一个以上的源文件这头,因为A::b
会被多次定义即可。 你应该定义移动到.cpp文件。
无论你是否有一个头文件保护与否,将是初始化头文件将意味着你会得到一个实例A::b
在包括头文件中的每个源文件。 因此,连接错误。
所以,一般来说,这是可能的,但不是一个好主意。