当前位置:编程学习 > C/C++ >>

c++全局对象的构造时机 by Mr.瑞

先看代码:
[cpp] 
#include <windows.h>  
#define showdbg(str) \  
{\  
    MessageBoxA(0,#str,"",0);\  
};  
  
class A  
{  
    public:  
        A()  
        {  
            showdbg("易做图me");  
        }  
        ~A()  
        {  
            showdbg("end");  
        }  
        void dosth()  
        {  
            showdbg("something");  
        }  
};  
A a;  
void main()  
{  
    a.dosth();  
}  
 
 如果采用了默认的编译和链接方式,结果是三个消息框。
但是我想看看这个全局对象a,是怎么初始化的。
编译:
cl /c /EHsc msg.cpp 
链接:
link /entry:main /subsystem:windows /nodefaultlib msg.obj
出现错误:提示未找到_atexit
原因猜测,全局对象它并不会无缘无故地在真正的main函数之前自己初始化。它需要利用到crt函数中的atexit注册某些函数(可能是析构函数)
 
再使用正常的编译方法:
cl msg.cpp
生成 msg.exe
在调试器中观察,发现全局对象的初始化过程是这样的:
在CRT中,msvcrt.dll 调用了链接器默认库(/nodefaultlib)中的_pre_cpp_init函数(这个函数的会被默认编译进入你的程序)。
just so.
所以书上说的全局对象会在MAIN函数之前自动构造,其实是错误的。它不是自动构造的,是CRT帮你做的。
 
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,