如果我有一个从未使用的内部链接的全局,它的初始化程序是否可以保证运行?例如:
static int x = SideEffectfulFunction();
或
namespace {
int x = SideEffectfulFunction();
}
即使从未引用SideEffectfulFunction()
,也可以保证调用x
吗?或者x
被删除是否合法?
答案 0 :(得分:9)
是的,标准保证了这个
静态存储时间[basic.stc.static]
2如果具有静态存储持续时间的变量具有初始化或具有副作用的析构函数,即使它看起来未被使用也不应被消除,除非可以按照15.8中的规定消除类对象或其复制/移动。
答案 1 :(得分:0)
保证运行。如果要创建多个在不同源文件中相互引用的静态对象,则无法保证对象的初始化顺序,这称为static initialization order fiasco
,在这种情况下,您可以创建一个创建的函数静态对象,确保初始化顺序首先是函数对象,然后是辅助对象。