2009-03-11 3 views
4

新しいメンバー関数をポインタクラス定義に追加するとバイナリ互換性が損なわれますか?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 

FYI:ヘッダーの代わりにccファイルにポインタクラスを指定する必要があります。上記の例は、バイナリ互換性の問題に焦点を当てて考案されています。

+0

タイルを改善することができます...新しい機能がプライベートクラスに追加されていることを明確にします。 – IsaacS

答えて

5

いいえ、それはありません。

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を互換性を持たせる最も良い方法は です。

+0

APIではなくABIを想定しています。 > "APIを制動しない" – IsaacS

1

abi-compliance-checkerツールを使用すると、ヘッダーファイルと共有ライブラリがチェックされ、バイナリ互換性を損なう可能性のあるABIの変更が検索されます。

+0

abi-compliance-checker、別名AbiCC –

関連する問題