статическое ключевое слово в файле h и внутренняя ссылка

Еще один статический вопрос. Я прочитал следующее:

И я все еще не понимают следующее поведение: У меня есть один h файл:

// StaticTest.h
#include 

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;

И два 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)

Теперь, A Конструктор вызывается дважды, поскольку файл h включается дважды, а поскольку экземпляр A с именем объявляется статическим , у него есть внутренняя компоновка, и компилятор доволен. Поскольку счетчик также объявлен статическим, он также имеет внутреннюю привязку, и я ожидаю, что его значение не будет использоваться совместно в двух файлах cpp , но вывод программы подразумевает значение является общим, так как оно рассчитано до 2.

какие-нибудь идеи?

РЕДАКТИРОВАТЬ: Также приветствуются любые ответы относительно того, что считается «хорошей привычкой программирования» в контексте объявления статических переменных в файлах h vs. cpp .

14
задан Community 23 May 2017 в 12:07
поделиться