2009-03-11 1 views
4

Wird die neue Memberfunktion in die d-Zeigerklassendefinition eingefügt, um die Binärkompatibilität zu unterbrechen?fügt neue Member-Funktion in D-Zeiger-Klasse Break-Binär-Kompatibilität?

Zum Beispiel, wird die neue Definition unten Binärkompatibilität im Vergleich zum Original brechen? (Seite Frage, gibt es ein Werkzeug, das mir sagen wird, wenn ein neue .so binäre Kompatibilität bricht im Vergleich zum alten .so Wenn nicht, wie kann ich überprüfen manuell?)

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 

Neu:

FYI: Ich verstehe d Zeiger Klasse sollte in der cc-Datei anstelle von Header angegeben werden. Das obige Beispiel wurde entwickelt, um auf das Problem der Binärkompatibilität zu fokussieren.

+0

Die Kachel kann verbessert werden ... es verdeutlicht besser, dass eine neue Funktion zu einer privaten Klasse hinzugefügt wird. – IsaacS

Antwort

5

Nein, tut es nicht.

Sie sollten verstehen, wie C++ seine Objekte erstellt.

In Ihrem Fall ist es nur fast "POD" -Klasse mit nicht-virtuellen Member-Funktionen. Diese Funktionen betreffen nicht die Darstellung von Objekten im Speicher. Somit ist die neue Version binärkompatibel mit alt.

Mehr als das, wenn Sie Ihre Klasse "APrivate" nicht dem Benutzer aussetzen. (Geben Sie keine eine Header-Forward-Deklaration), würden Sie eine API nicht bremsen, auch wenn Sie viel größere Änderungen vornehmen.

Bedeutung:

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

Sie haben nicht einmal aussetzen bar so kann man es in irgendeiner Weise möchten Sie ändern. Es ist die beste Möglichkeit, C++ - Bibliotheken ABI-kompatibel zu machen.

+0

Ich nehme ABI an, nicht API. > "Sie würden eine API nicht bremsen" – IsaacS

1

Erwägen Sie die Verwendung des Tools abi-compliance-checker, es überprüft Header-Dateien und freigegebene Bibliotheken und sucht nach ABI-Änderungen, die die Binärkompatibilität beeinträchtigen können.

+0

abi-compliance-checker, alias AbiCC –

Verwandte Themen