私が取り組んでいるこの C++ ライブラリのバイナリ互換性を維持する必要があります。
現在、私はこれらの線に沿って何かを持っています
class Foo
{
void Bar()
{
static bool flag = true;
}
}
を削除flag
すると のバイナリ互換性が失われFoo
ますか?
余談ですが、私のコンパイラは現在VC7.1です。
私が取り組んでいるこの C++ ライブラリのバイナリ互換性を維持する必要があります。
現在、私はこれらの線に沿って何かを持っています
class Foo
{
void Bar()
{
static bool flag = true;
}
}
を削除flag
すると のバイナリ互換性が失われFoo
ますか?
余談ですが、私のコンパイラは現在VC7.1です。
変数は関数のインターフェイスのstatic
一部ではないため、バイナリ互換性には影響しません。それでもなお、関数が非常に単純な場合は、インライン化されている可能性があることに注意してください。この場合、すべてのユーザーを再コンパイルしないと、ODR が壊れることになります。
簡単なアドバイス: 可能であれば再コンパイルしてください。不可能な場合は、元のコードでインライン化されていないことを確認してください。
何かが確実にクラッシュする、またはそのプログラムが起動しないという意味で、バイナリ互換性が損なわれることはありません。
ただし、そのメソッドがインライン化された場合、機能が損なわれる可能性があります。インライン化されたバージョンは引き続きその静的変数にアクセスし、新しいヘッダー ファイルに対してビルドされたコードは、静的変数を使用しないメソッドを生成します。これが問題になるかどうかはコードによって異なりますが、多くの場合、静的変数 (再コンパイルされたコードでは使用されません) は単に楽しみのためではなく、代わりの変数 (使用されません) もありません。古いインラインコードによる)。
教訓: ライブラリ ヘッダーの変更後にすべてを再コンパイルすることを避けたい場合は、ヘッダー ファイル内のコードから静的変数にアクセスしたり、変更したいその他のことを行ったりしないでください。ヘッダー ファイル内のすべてのコードがインライン化される可能性があると想定します。
関連する質問:インライン関数の静的変数
いいえ。外部からの可視性はありません。