依存関係のある C でグローバル変数の適切な初期化を保証する方法は?

Linda Hamilton
リリース: 2024-11-03 22:56:02
オリジナル
635 人が閲覧しました

 How to Guarantee Proper Initialization of Global Variables in C   with Dependencies?

C グローバル初期化順序: 依存関係の探索

C では、通常、翻訳単位内のグローバル変数は宣言された順序で初期化されます。ただし、複数の翻訳単位にわたる初期化順序を考慮すると、混乱が生じる可能性があります。

初期問題のシナリオ

次のコードを考えてみましょう。

<code class="cpp">struct Foo {
    Foo() { printf("Foo::Foo()\n"); }
    void add() { printf("Foo::add()\n"); }
    static int addToGlobal() {
        globalFoo.add();
        return 0;
    }
};

Foo globalFoo;

int dummy = Foo::addToGlobal();

int main() { printf("main()\n"); return 0; }</code>
ログイン後にコピー

Withこのコードでは、期待される出力は次のとおりです:

Foo::Foo()
Foo::addToGlobal() START
Foo::add()
Foo::addToGlobal() END
main()
ログイン後にコピー

ただし、dummy と globalFoo の宣言と初期化を交換すると、別の出力になります:

Foo::addToGlobal() START
Foo::add()
Foo::addToGlobal() END
Foo::Foo()
main()
ログイン後にコピー

初期化の順序と依存関係

この動作は、グローバル変数の初期化順序が依存関係を無視していることを示唆しています。この場合、Foo::addToGlobal() への呼び出しは、コンストラクターが呼び出される前に Foo のメソッドにアクセスしようとします。

解決策: 正しい初期化を確保する

ダミーが初期化される前に Foo のコンストラクターが確実に呼び出されるようにするには、同じ翻訳単位でダミーの前に globalFoo を定義します。これにより、globalFoo が最初に初期化されることが保証され、addToGlobal() がそのメソッドに正常にアクセスできるようになります。

代替解決策: 静的初期化ガード

あるいは、静的メソッドを導入することもできます。 Foo::addToGlobal():

<code class="cpp">static Foo* pFoo = nullptr;

if (pFoo == nullptr) {
    pFoo = &globalFoo;
}

pFoo->add();</code>
ログイン後にコピー

内の初期化ガード。このチェックにより、メソッドにアクセスする前にポインタ pFoo が globalFoo に初期化されていることを確認し、globalFoo の時期尚早な使用を効果的に防止します。

以上が依存関係のある C でグローバル変数の適切な初期化を保証する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!