【问题标题】:Accessibility of static data members in an exported class (DLL)?导出类 (DLL) 中静态数据成员的可访问性?
【发布时间】:2012-02-16 22:19:19
【问题描述】:

假设我有这个类:

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

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

  1. 导入此类的客户端是否可以访问静态成员“Bar”?
  2. 静态成员“OtherStuff”是否也会被导出?如果不是,这是因为访问修饰符private:
  3. 如果类MyOtherClass没有用__declspec(dllexport)定义,我相信这意味着警告C4251将由MSVC编译器发出,但这是否意味着变量Foo将无法被导入的客户端访问这堂课?

我基本上只是在脑海中运行各种场景,试图仅就静态数据成员而言,找出 DLL 类接口中哪些是导出的,哪些不是导出的(因此无法访问)。

【问题讨论】:

  • 您可能想要构建一个测试 DLL,然后在其上运行 dumpbin /exports - 这将确切地告诉您发生了什么。
  • @Bukes 有什么方法可以让我使用 Dependency Walker 进行检查吗?
  • 当前版本的 Dependency Walker 中的导出窗格将显示从 DLL 导出的所有内容,包括变量和类。您还可以“取消装饰符号”,这会删除一些名称修饰。

标签: c++ visual-c++ dll dllimport dllexport


【解决方案1】:

代码:

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,我不确定在这种情况下会发生什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多