5

私が取り組んでいるこの C++ ライブラリのバイナリ互換性を維持する必要があります。

現在、私はこれらの線に沿って何かを持っています

class Foo
{
    void Bar()
    {
        static bool flag = true;
    }
}

を削除flagすると のバイナリ互換性が失われFooますか?

余談ですが、私のコンパイラは現在VC7.1です。

4

3 に答える 3

2

変数は関数のインターフェイスのstatic一部ではないため、バイナリ互換性には影響しません。それでもなお、関数が非常に単純な場合は、インライン化されている可能性があることに注意してください。この場合、すべてのユーザーを再コンパイルしないと、ODR が壊れることになります。

簡単なアドバイス: 可能であれば再コンパイルしてください。不可能な場合は、元のコードでインライン化されていないことを確認してください。

于 2013-03-19T12:29:02.653 に答える
1

何かが確実にクラッシュする、またはそのプログラムが起動しないという意味で、バイナリ互換性が損なわれることはありません。

ただし、そのメソッドがインライン化された場合、機能が損なわれる可能性があります。インライン化されたバージョンは引き続きその静的変数にアクセスし、新しいヘッダー ファイルに対してビルドされたコードは、静的変数を使用しないメソッドを生成します。これが問題になるかどうかはコードによって異なりますが、多くの場合、静的変数 (再コンパイルされたコードでは使用されません) は単に楽しみのためではなく、代わりの変数 (使用されません) もありません。古いインラインコードによる)。

教訓: ライブラリ ヘッダーの変更後にすべてを再コンパイルすることを避けたい場合は、ヘッダー ファイル内のコードから静的変数にアクセスしたり、変更したいその他のことを行ったりしないでください。ヘッダー ファイル内のすべてのコードがインライン化される可能性があると想定します。

関連する質問:インライン関数の静的変数

于 2013-03-19T12:47:09.467 に答える
0

いいえ。外部からの可視性はありません。

于 2013-03-19T12:28:02.137 に答える