静态库和动态库里的全局变量(或类的静态成员变量)共享和独立的问题
来源:互联网 发布:折八百淘宝商城女装 编辑:程序博客网 时间:2024/06/06 01:16
本文将要讨论的内容实际上包含2个问题:
1. 工程中包含静态库A,动态库B,可执行程序C。C依赖于A和B,而B依赖于A。在A中定义有全局变量X(或类的静态成员变量),则在动态库B中访问的X,与可执行程序C中访问的X是同一个变量还是两个不同的变量?
答案:是两个不同的变量。
测试代码如下:
//A中定义变量g_nValue(A.cpp):int g_nValue = 0; //B代码 (B.cpp):extern int g_nValue;BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ return TRUE;}void SetValue(int value){ g_nValue = value;}//C代码 (TestDlgDlg.cpp):extern void SetValue(int);extern int g_nValue;void CTestDlgDlg::OnButton1() { CString strMessage; SetValue(23); strMessage.Format("g_nValue=%d\n", g_nValue); AfxMessageBox(strMessage);}
执行结果: g_nValue = 0,SetValue没有起作用,因为此时,在B和C中有两个g_nValue的拷贝,SetValue(23)修改的只是B中的拷贝,不会影响C中的值。
静态库就是这样,与B和C它们自己分别定义g_nValue效果是一样的,因为静态库在编译阶段就把A的代码链接到B和C中,像它们自己的代码一样。
2. 工程中包含动态库A,动态库B,可执行程序C。C依赖于A和B,而B依赖于A。在A中定义有全局变量X(或类的静态成员变量),则在动态库B中访问的X,与可执行程序C中访问的X是同一个变量还是两个不同的变量?(注:所有库都在同一进程中使用)
答案:是共享同一个变量。即:在A是动态库的这种情况下,B和C访问到的X是同一变量。
测试代码如下:
//A中定义变量g_nValue(A.cpp):__declspec(dllexport) int g_nValue = 0; //B代码 (B.cpp):__declspec(dllimport) int g_nValue;BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ return TRUE;}void SetValue(int value){ g_nValue = value;}//C代码 (TestDlgDlg.cpp):extern void SetValue(int);__declspec(dllimport) int g_nValue;void CTestDlgDlg::OnButton1() { CString strMessage; SetValue(23); strMessage.Format("g_nValue=%d\n", g_nValue); AfxMessageBox(strMessage);}
执行结果: g_nValue = 23,证明SetValue起了作用,修改g_nValue为23,在A是动态库时,这个变量在B和C中指向同一实例,就是A中定义的g_nValue。
从这个测试中也可以看到__declspec(dllexport),__declspec(dllimport)这两个关键字的作用,可以从动态库中导出和导入变量。
本测试源码我已经上传了,有兴趣的可以在csdn下载:
http://download.csdn.net/detail/guggy/4711045
- 静态库和动态库里的全局变量(或类的静态成员变量)共享和独立的问题
- 静态函数里定义的变量,不为所有对象共享,类的静态变量和类外全局变量区别,静态函数和普通函数区别
- 全局变量和静态变量的初始化问题
- 静态-全局静态函数(或变量)和类的静态成员函数(或变量)
- 类的静态成员函数和静态成员变量
- 25-类的静态成员变量和静态成员函数
- 静态、共享和动态库的使用
- 静态、共享和动态库的使用
- C++ 的静态成员和静态变量
- C++ 全局变量、静态全局变量和静态局部变量的异同
- 全局变量、静态全局变量和静态局部变量的链接性
- 静态成员变量和非静态成员变量的对比
- Python的静态成员变量和非静态成员变量
- 静态成员变量和非静态成员变量的区别
- 全局变量和局部变量的区别/静态成员函数变量和非静态函数变量的区别
- 对静态变量和全局变量的认识
- 全局变量和静态变量的区别
- 静态变量和全局变量的区别
- discuz 论坛DIY增加{lastposter}最后回复者以及{forumicon}版块图标调用解读
- 雷军投资原则
- 从陌生到熟悉,再变成最熟悉的陌生人:伤感日志
- Socket网络通信理论基础搜集(TCP/IP协议栈与数据包封装+TCP与UDP的区别)
- NAS是File level access, SAN是Block level access
- 静态库和动态库里的全局变量(或类的静态成员变量)共享和独立的问题
- sql not in、left join、not exists
- apache 安装
- mysql的优化2
- 框架的艺术
- Mac App Store – “You have updates available for other accounts” bug
- 在linux终端下输出带颜色的字体
- tomcat配置项目路径问题
- SetCapture捕获鼠标 ,转换获取的坐标