未使用的全局变量的静态初始值设定项

Static initializers of unused global

如果我有一个从未使用过的带有内部链接的全局变量,它的初始值设定项是否保证为 运行?例如:

static int x = SideEffectfulFunction();

namespace {
    int x = SideEffectfulFunction();
}

是否保证 SideEffectfulFunction() 被调用,即使 x 从未被引用?或者删除 x 是否合法?

是的,标准保证了这一点

静态存储时长[basic.stc.static]

2 If a variable with static storage duration has initialization or a destructor with side effects, it shall not be eliminated even if it appears to be unused, except that a class object or its copy/move may be eliminated as specified in 15.8.

保证运行。如果您要创建多个在不同源文件中相互引用的静态对象,则无法保证对象的初始化顺序,这称为 static initialization order fiasco,在这种情况下,您可以创建一个函数来创建静态对象,保证初始化顺序是先函数对象,后次对象。

来源: https://isocpp.org/wiki/faq/ctors#static-init-order