未使用的全局变量的静态初始值设定项
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
,在这种情况下,您可以创建一个函数来创建静态对象,保证初始化顺序是先函数对象,后次对象。
如果我有一个从未使用过的带有内部链接的全局变量,它的初始值设定项是否保证为 运行?例如:
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
,在这种情况下,您可以创建一个函数来创建静态对象,保证初始化顺序是先函数对象,后次对象。