ли добавление новой функции-члена в класс указателя d нарушает бинарную совместимость? - PullRequest
4 голосов
/ 11 марта 2009

Будет ли добавление новой функции-члена в определение класса d указателя нарушить двоичную совместимость?

Например, будет ли новое определение ниже бинарной совместимости по сравнению с оригиналом? (дополнительный вопрос, есть ли инструмент, который сообщит мне, если новый .so нарушает бинарную совместимость по сравнению со старым .so? Если нет, то как проверить вручную?)

Оригинал:

#ifndef __TESTBC_H__
#define __TESTBC_H__
class APrivate;

class A
{
  public:
   int get() { d->update(); return _d->get(); }

private:
   APrivate *_d;

};

class APrivate
{
  public:
   int get() { return _val; }
   void update() { _val = 1; }

  private:
   int _val;
};
#endif

Новое:

#ifndef __TESTBC_H__
#define __TESTBC_H__
class APrivate;

class A
{
  public:
   int get() { _d->update(); return _d->get(); }

private:
   APrivate *_d;

};

class APrivate
{
  public:
   int get() { return _val; }
   void update() { _val = 1; multiply(); }
   void multiply() { _val = _val * 10; }

  private:
   int _val;
};
#endif

К вашему сведению: я понимаю, что указатель класса d должен быть указан в файле cc вместо заголовка. Приведенный выше пример придуман, чтобы сосредоточиться на проблеме бинарной совместимости.

Ответы [ 2 ]

5 голосов
/ 11 марта 2009

Нет, это не так.

Вы должны понимать, как C ++ создает свои объекты.

В вашем случае это просто класс "POD" с не виртуальными функциями-членами. Эти функции не ограничивают представление объекта в памяти. Таким образом, новая версия бинарно совместим со старым.

Более того, если вы не предоставляете пользователю свой класс "APrivate". (Не давая заголовок, просто жду декларации), вы бы не тормозили API, даже если вы делаете намного больше изменения.

Значение:

#ifndef YOUR_PUBLIC_API
#define YOUR_PUBLIC_API
class bar;
class foo {
public:
    // member functions using bar
private:
    bar *bar_;
};
#endif

Вы даже не выставляете bar, поэтому вы можете изменить его так, как пожелаете. это лучший способ сделать библиотеки C ++ совместимыми с ABI.

1 голос
/ 08 августа 2009

Рассмотрите возможность использования инструмента abi-compatibility-checker , он проверяет заголовочные файлы и разделяемые библиотеки и ищет изменения ABI, которые могут нарушить двоичную совместимость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...