Рассмотрим случай функции-члена класса, определенной в заголовке, с static
переменная хранения. Когда вы включаете заголовок в несколько модулей компиляции, вы получите несколько копий static
переменная. Тем не мение, компилятор исправит это за вас, и просто выберите одну из выпущенных переменных (обратите внимание, что это отличается от встраивания). Это обеспечивается конкретным расширением GNU для возможных типов символов, точно gnu_unique_object
(они отображаются как «ты» в nm
, который называет их на страницах справочника «уникальными глобальными символами»).
Вопрос в том, как заставить компилятор генерировать символы такого типа для произвольных переменных? Я устал от оборачивания вещей в классе, чтобы получить такое поведение.
Если вы объявите глобальную переменную в заголовочном файле, вы получите разные экземпляры этой переменной в каждом модуле компиляции. extern
ключевое слово это то, что вы после. Это ключевое слово превращает то, что выглядит как экземпляр в предварительное объявление. Это можно представить как обещание, что переменная с таким именем будет создана в другом модуле компиляции и будет доступна при компоновке.
MyTrueGlobals.h
extern int global_variable_1;
MyTrueGlobals.cpp
int global_variable_1 = 0;
Других решений пока нет …