2012-02-16 51 views
1

假设我有这个类:导出类(DLL)中静态数据成员的可访问性?

class __declspec(dllexport) MyClass 
{ 
    public: 
    static int Bar; 
    static MyOtherClass Foo; 
    private: 
    static int OtherStuff; 
}; 

我有一些问题(我使用的是MSVC编译器):

  1. 将静态成员“酒吧”是那些进口此类客户端访问?
  2. 静态成员“OtherStuff”是否也会被导出?如果不是,这是由于访问修饰符private:
  3. 如果该类MyOtherClass不与__declspec(dllexport)定义,我认为这意味着警告C4251将由MSVC编译器发出的,但是这是否意味着变量Foo不会给进口该类客户机访问?

我基本上只是在脑海中运行各种场景,试图找出什么是什么,什么是不导出(因此无法访问)在DLL类接口静态数据成员方面。

+0

你可能想要构造一个测试DLL,然后运行dumpbin/exports - 这会告诉你一定发生了什么。 – Bukes 2012-02-16 22:33:07

+0

@Bukes是否有某种方式可以使用Dependency Walker来检查? – 2012-02-16 22:40:49

+0

Dependency Walker当前版本中的导出窗格将向您显示从DLL导出的所有内容,包括变量和类。您也可以“取消装饰符号”,从而删除一些名称的混乱。 – Bukes 2012-02-16 23:09:33

回答

0

的代码:

class MyOtherClass 
{ 
public: 
    int something; 
}; 

class __declspec(dllexport) MyClass 
{ 
    public: 
    static int Bar; 
    static MyOtherClass Foo; 
    private: 
    static int OtherStuff; 
}; 

int MyClass::Bar = 0; 
MyOtherClass MyClass::Foo; 
int MyClass::OtherStuff = 0; 

我得到的Dependency Walker如下:

class MyClass & MyClass::operator=(class MyClass const &) 
int MyClass::Bar 
class MyOtherClass MyClass::Foo 
int MyClass::OtherStuff 

显然可变MyClass::Foo确实是出口,但类MyOtherClass。我不确定在这种情况下会发生什么,如果您尝试从该静态变量访问MyOtherClass::something