Доступность статических членов данных в экспортируемом классе (DLL)? - PullRequest
1 голос
/ 17 февраля 2012

Предположим, у меня есть этот класс:

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 в терминах только статических членов данных.

1 Ответ

0 голосов
/ 17 февраля 2012

Для кода:

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 из этой статической переменной.

...