15

さらに別のstatic質問。私は以下を読みました:

そして、私はまだ次の動作を理解できません:私は1つのhファイルを持っています:

// StaticTest.h
#include <stdio.h>

static int counter = 0;

struct A {
    A () {
        counter++;
        printf("In A's ctor(%d)\n", counter);
    }
    ~A () {
        counter--;
        printf("In A's dtor(%d)\n", counter);
    }
};

static A a;

そして2つのcppファイル:

// StaticTest1.cpp
#include "StaticTest.h"

int main () {
 return 0;
}

と:

// StaticTest2.cpp
#include "StaticTest.h"

プログラムの出力は次のとおりです。

In A's ctor(1)
In A's ctor(2)
In A's dtor(1)
In A's dtor(0)

これで、ファイルが2回含まれてAいるため、コンストラクターが2回呼び出され、名前付きのインスタンスが宣言されているため、内部リンケージがあり、コンパイラーは満足しています。も静的に宣言されているため、内部リンケージもあり、その値は2つのファイルで共有されないことが予想されますが、プログラム出力は、2までカウントされるため、値が共有されることを意味します。hAastaticcountercpp

洞察はありますか?

h編集: vs 。ファイルで静的変数を宣言するという文脈で「良いプログラミング習慣」と見なされるものに関する回答cppも歓迎します。

4

1 に答える 1

13

StaticTest.h異なるソースファイル間で共有されている場合、未定義の動作が発生します。

異なる変換単位でクラスまたはインライン関数を定義する場合、それらの定義は同じ(トークンの同じシーケンス)である必要があり、重要なことに、すべての識別子はconst、の定義と同じエンティティを参照する必要があります(内部リンケージを持つオブジェクトを除く)。別の翻訳単位。

counter内部リンケージがあるため、これに違反します。異なる変換単位では、関数定義の識別子が異なるオブジェクトを参照します。

参照:C ++ 03 3.2 [basic.def.odr]/5。

于 2010-11-25T12:09:07.877 に答える