Pregunta

¿Agregar nueva función miembro a la definición de clase de puntero d romperá la compatibilidad binaria?

Por ejemplo, ¿la nueva definición a continuación romperá la compatibilidad binaria en comparación con la original? (pregunta secundaria, ¿hay alguna herramienta que me diga si un nuevo .so rompe la compatibilidad binaria en comparación con el antiguo .so? Si no, ¿cómo puedo verificarlo manualmente?)

Original:

#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

Nuevo:

#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

Para su información: entiendo que la clase de puntero d debe especificarse en el archivo cc en lugar del encabezado. el ejemplo anterior está diseñado para centrarse en el problema de compatibilidad binaria.

¿Fue útil?

Solución

No, no lo hace.

Debe entender cómo C ++ construye sus objetos.

En su caso, es casi "POD" clase con funciones miembro no virtuales. Estas Las funciones no afectan la representación del objeto en la memoria. Así nueva versión es binario compatible con el antiguo.

Más que eso, si no expone su " APrivate " clase para el usuario. (No dar una declaración de encabezado solo hacia adelante), no frenaría una API incluso si lo hace mucho más grande cambios.

Significado:

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

Ni siquiera expones bar , por lo que puedes cambiarlo de la forma que desees. es el mejor forma de hacer que las bibliotecas C ++ sean compatibles con ABI.

Otros consejos

Considere usar la herramienta abi-compliance-checker , verifica los archivos de encabezado y bibliotecas compartidas y búsquedas de cambios ABI que pueden romper la compatibilidad binaria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top