С++ - Хорошо объявить статическую глобальную переменную в файле .h?
статическое ключевое слово сохраняет область глобальной переменной, ограниченную этой единицей перевода.
Если я использую static int x
в файле .h и включаю этот файл .h в каждый другой файл, не все ли они принадлежат одной и той же переводческой единице?
Тогда, не будет ли х видимым повсюду?
Итак, какова роль статики сейчас?
Кроме того, существует ли использование static const int x
, где x - глобальная переменная?
По умолчанию не все константные глобальные переменные const?
И является ли область ограничений const ограничена TU, даже если она ограничена в цикле for в файле?
Ответы
Ответ 1
Если вы пишете
static const int x
в файле .h, тогда каждая единица перевода, в которой # include-s, будет иметь свою собственную переменную x
.
Если вы хотите, чтобы 1 глобальная переменная была видимой для всех, вы должны написать
extern const int x;
в файле .h и
const int x = ...;
в одном из .cpp файлов.
Если вы хотите, чтобы статическая константа int была видимой только для одной единицы перевода - вообще не упоминайте ее в файлах .h.
Ответ 2
Если я использую static int x в файле .h и включаю этот файл .h другой файл, не все ли они принадлежат одной и той же единицы перевода?
Если вы объявляете что-то как статическое (не внутри класса, для ключевого слова static static class), то статическая переменная не может быть замечена вне ее TU. Поэтому, помещая его в файл заголовка, каждый TU, включая этот заголовок, будет иметь другую частную копию этой статической переменной.
И представляет собой область с переменными const, ограниченную TU, даже если она ограничена в цикле for в файле?
НЕТ. Даже для значения static const, объем определяется его объявлением. Таким образом, объем будет ограничен вашим скобками.
Ответ 3
в итоге вы получите личные копии этой переменной для перевода, что приведет к раздуванию, если вы поместите ее туда. также было бы бессмысленно иметь случайные копии повсюду. нет, это не нормально.
вы можете объявить const int
в блоке namespace
; это нормально.
Ответ 4
Наблюдаемая разница для переменных, которые const
квалифицированы, заключается в том, что в версии static
вы получите один экземпляр на единицу перевода, и поэтому сравнительные сравнения двух таких копий могут потерпеть неудачу.
Если вы никогда не используете адрес вашей переменной const
, любой современный компилятор должен иметь возможность просто использовать значение и оптимизировать сама переменная. В таком случае a static
const
-квалифицированная переменная полностью прекрасна.
Ответ 5
В принципе, каждый исходный файл вместе со всеми включенными заголовочными файлами является отдельной единицей перевода. Итак, если у вас есть статическая переменная в файле заголовка, то она будет уникальной в каждом исходном файле (единица перевода), в который будет включен заголовочный файл.