带有静态/动态链接的静态初始化订单问题 如果C++应用程序按以下方式组织< /P> //file1.cpp static Y sgObj = X::getInitObject(0); //declared in file scope //file2.cpp namespace{ int getInitValue() { static int val = Y::sObj.initVal(); return val; } } namespace X{ Y getInitObject(int initVal) { if(initVal < getInitValue()) { cout << "Print some log message" << endl; } return Y::initMethod(initVal); } } //file.h //This class is shipped as static and dynamic library, and application is supposed to link //them in their executable based on their need class Y{ public: int initVal(); static Y initMethod(int val); static Y sObj; }; //file1.cpp 静态Y sgObj=X::getInitObject(0)//在文件范围中声明 //file2.cpp 名称空间{ int getInitValue() { 静态int val=Y::sObj.initVal(); 返回val; } } 名称空间X{ Y getInitObject(int initVal) { if(initValsgObj相反。您只需确保它们不是都有非本地静态存储持续时间。无论是静态链接还是动态链接,都无所谓。(在某些平台和/或编译器扩展上可能有一些特定的其他保证,允许您跨编译单元指定构造顺序,但不可移植。) class Y{ //... static Y& sObj { static Y instance /* initializer here */; return instance; } };
您必须确保带有静态/动态链接的静态初始化订单问题 如果C++应用程序按以下方式组织< /P> //file1.cpp static Y sgObj = X::getInitObject(0); //declared in file scope //file2.cpp namespace{ int getInitValue() { static int val = Y::sObj.initVal(); return val; } } namespace X{ Y getInitObject(int initVal) { if(initVal < getInitValue()) { cout << "Print some log message" << endl; } return Y::initMethod(initVal); } } //file.h //This class is shipped as static and dynamic library, and application is supposed to link //them in their executable based on their need class Y{ public: int initVal(); static Y initMethod(int val); static Y sObj; }; //file1.cpp 静态Y sgObj=X::getInitObject(0)//在文件范围中声明 //file2.cpp 名称空间{ int getInitValue() { 静态int val=Y::sObj.initVal(); 返回val; } } 名称空间X{ Y getInitObject(int initVal) { if(initValsgObj相反。您只需确保它们不是都有非本地静态存储持续时间。无论是静态链接还是动态链接,都无所谓。(在某些平台和/或编译器扩展上可能有一些特定的其他保证,允许您跨编译单元指定构造顺序,但不可移植。) class Y{ //... static Y& sObj { static Y instance /* initializer here */; return instance; } };,c++,c++11,C++,C++11,您必须确保file1.cpp在定义sgObj之前包含,或者在静态初始化期间使用cout之前,您需要构造一个类型为std::ios_base::Init的本地对象: if(initVal < getInitValue()) { (void)std::ios_base::Init{}; cout << "Print some log message" << endl; } 用作Y::sObj()而不是Y::sObj鉴于应用程序无法访问Y
file1.cpp
在定义sgObj
之前包含
,或者在静态初始化期间使用cout
之前,您需要构造一个类型为std::ios_base::Init
的本地对象:
if(initVal < getInitValue())
{
(void)std::ios_base::Init{};
cout << "Print some log message" << endl;
}
用作
Y::sObj()
而不是Y::sObj
鉴于应用程序无法访问Y类实现,我们有没有其他方法可以绕过这个不确定的对象创建问题?在这两种情况下都会有问题,即静态链接还是动态链接?@DineshMaurya您也可以将Meyers单例用于全局应用程序>sgObj
相反。您只需确保它们不是都有非本地静态存储持续时间。无论是静态链接还是动态链接,都无所谓。(在某些平台和/或编译器扩展上可能有一些特定的其他保证,允许您跨编译单元指定构造顺序,但不可移植。)
class Y{
//...
static Y& sObj {
static Y instance /* initializer here */;
return instance;
}
};