我想知道 cpp 标准对全局初始化有什么看法。我发现这个答案很有帮助,但没有提到指针类型。
有保证这会起作用吗?
char* myptr
int main()
{
if (myptr == NULL)
{
std::cout << "All good!" << std::endl;
}
}
是的,保证在命名空间范围(在本例中为全局命名空间)定义的指针初始化为该类型的正确 null 指针值。
对于标准参考,
3.6.2[basic.start.init]/2
"具有静态存储持续时间的变量...应为零初始化 (8.5)"
8.5[dcl.init]/6
"零初始化...表示:如果 T 是标量类型 (3.9),则对象初始化为通过转换整数文本获得的值 0(零)到 T;[106]"106) 如 4.10 中所述,将值为 0 的整数文本转换为指针类型会导致指针值为 null
。
(强调我的)
我会附加到上一篇文章@Cubbi根据相同的标准,标量类型是
算术类型 (3.9.1)、枚举类型、指针类型、指针指向 成员类型 (3.9.2)、std::nullptr_- T 和符合 CV 标准的版本 这些类型 (3.9.3) 统称为标量类型
然后
具有静态存储持续时间的非局部变量初始化为 程序启动的结果。
和
具有静态存储持续时间 (3.7.1) 或线程存储的变量 持续时间 (3.7.2) 应在任何其他之前初始化 (8.5) 为零 进行初始化。