Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有静态/动态链接的静态初始化订单问题 如果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 - Fatal编程技术网

带有静态/动态链接的静态初始化订单问题 如果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;
    }
};