假设我在头文件中有X.DLL
以下内容:
extern __declspec(dllexport) int foobar;
然后在实现文件中的foobar
内定义此X.DLL
全局变量:
int foobar = 1;
现在假设我有两个DLL,A.DLL
和B.DLL
,它们与X.DLL
相关联,而应用E.EXE
则使用A.DLL
和{ {1}}:
B.DLL
在这种情况下,在 +----> A.DLL ----+
| |
E.EXE ----+ +----> X.DLL
| |
+----> B.DLL ----+
和&foobar
内进行评估时,表达式foobar
(A.DLL
的地址)是否保证具有相同的值?换句话说,B.DLL
的全局变量是存储两次还是在整个过程中只有X.DLL
的一个实例?另外,如果DLL在加载时或通过调用LoadLibrary
进行链接会有所不同吗?
我也对GCC documentation for dllimport中的这句话感到困惑:
使用此属性的一个缺点是指向标记为
foobar
的变量的指针不能用作常量地址。
考虑到上述情况,我不太明白该陈述的含义。
答案 0 :(得分:2)
只有一份副本。但是,总的来说,这样做是一个非常糟糕的主意,你会遇到很多问题。