【发布时间】:2011-06-29 12:16:37
【问题描述】:
假设我有一个X.DLL,头文件中有以下内容:
extern __declspec(dllexport) int foobar;
这个foobar 全局变量随后在一个实现文件的X.DLL 中定义:
int foobar = 1;
现在假设我有两个 DLL,A.DLL 和 B.DLL,它们链接到 X.DLL,以及一个使用 A.DLL 和 B.DLL 的应用程序 E.EXE:
+----> A.DLL ----+
| |
E.EXE ----+ +----> X.DLL
| |
+----> B.DLL ----+
在这种情况下,表达式&foobar(foobar 的地址)在A.DLL 和B.DLL 内部计算时是否保证具有相同的值?也就是说X.DLL的全局变量是存储了两次还是整个过程中只有一个foobar的实例?此外,如果在加载时链接 DLL 或通过调用 LoadLibrary 链接 DLL,是否会有所不同?
我也对 GCC 的 documentation for dllimport 中的这句话感到困惑:
使用此属性的一个缺点是指向标记为
dllimport的变量的指针不能用作常量地址。
考虑到我前面提到的情况,我不太明白该声明的含义。
【问题讨论】: