静态成员的问题

1 c++ static

假设我在C++中有这个类:

class A
{
public:
    static const TDouble pi_d;
    static const TDouble pi;
    static const TDouble div;
};
Run Code Online (Sandbox Code Playgroud)

它们按以下方式在.h文件中初始化:

const TDouble A::pi_d = 3.14;
const TDouble A::pi   = A::pi_d;
const TDouble A::div  = A::pi / 180.0;
Run Code Online (Sandbox Code Playgroud)

当我打印成员div时,结果为0.0000.如果我更改此行:

const TDouble A::pi   = A::pi_d;
Run Code Online (Sandbox Code Playgroud)

用这一行:

const TDouble A::pi   = 3.14;
Run Code Online (Sandbox Code Playgroud)

然后一切正常,打印出正确的值.

你知道这是什么原因吗?

感谢您的时间.阿萨夫.

Ric*_*den 7

引用"静态初始化顺序"的答案对于在不同翻译单元中定义但在相同TU内定义的顺序的对象是正确的:

9.4.2/7:

静态数据成员的初始化和销毁​​与非本地对象完全相同(3.6.2,3.6.3).

3.6.2/1:

在同一翻译单元的命名空间范围内定义并动态初始化的静态存储持续时间的对象应按其定义出现在翻译单元中的顺序进行初始化.

您的定义是正确排序的,因此应按正确的顺序初始化它们.我会接受AProgrammer关于多个定义的评论.与非成员const对象不同,您的对象具有外部链接:

3.5/5:

此外,如果类的名称具有外部链接,则成员函数,静态数据成员,类范围的类或枚举具有外部链接.

如果头文件包含在多个翻译单元中,那么代码违反了ODR,我猜测得到的未定义行为是初始化的直线性.尝试将静态成员的定义放入单个源文件中,看看会发生什么.

  • 如果.h文件包含在多个.c文件中,则应用ODR. (2认同)