6

ヘッダー内の関数の宣言順序に意味があるのだろうか。

想像してみましょう: 同じヘッダー定義を使用する 2 つのプロジェクトがあり、何らかの理由でヘッダーをコピーする必要がありました。また、これらのヘッダーは、宣言関数の順序に関して同じではありません。

したがって、最初のプロジェクトのヘッダーは次のようになります。

class A {
  someFunctionA();
  someFunctionB();
}

および 2 番目のプロジェクトのヘッダー:

class A {
  someFunctionB();
  someFunctionA();
}

そして、最初のプロジェクトで作成した実装を 2 番目のプロジェクト (動的ライブラリなど) で使用するとどうなりますか?

両方のプロジェクトで同じヘッダー定義を使用する必要があることは承知しています。コンパイラが関数に何らかのスタックを使用するのか、それとも並べ替えるのか疑問に思っていました。

4

3 に答える 3

8

厳密に言えば、両方のクラス定義が同一である (前処理後に同じトークン シーケンスで構成されると定義されている) 場合を除き、動作は未定義です。

実際には、両方のクラスのメモリ レイアウトが同じである限り、おそらく問題はありません。非仮想メンバー関数を追加、削除、または並べ替えても、レイアウトには影響しません。基底クラス、データ メンバー、または仮想メンバー関数に対してこれを行うと、レイアウトに影響し、恐ろしく不可解なバグにつながる可能性があります。

互換性のない変更を防ぐことは不可能であるため、これを行わないことを強くお勧めします。プロジェクト間で同じクラス定義を共有する方法を見つけるか、完全に分岐して各分岐を個別に維持します。

于 2013-11-08T13:03:21.143 に答える
2

同じヘッダー ファイルを共有している場合でも、バージョン管理でこの問題に遭遇する可能性があります。たとえば、プロジェクトがダイナミック ライブラリのバージョン 1 に対してコンパイルされている可能性があります。次に、プロジェクトを再コンパイルせずにライブラリのバージョン 2 を出荷します。そのような状況では、ライブラリがバイナリ互換性を壊さないようにする必要があります。

バイナリ互換性を維持するためにできることとできないことの良いリストはここにあります: http://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C++#The_Do.27s_and_Don.27ts

あなたの質問に答えるために、非仮想関数は並べ替えることができますが、メンバー変数や仮想関数は並べ替えることができません。

于 2013-11-08T13:14:25.053 に答える