Подтвердить что ты не робот

С++ - Хорошо объявить статическую глобальную переменную в файле .h?

статическое ключевое слово сохраняет область глобальной переменной, ограниченную этой единицей перевода. Если я использую static int x в файле .h и включаю этот файл .h в каждый другой файл, не все ли они принадлежат одной и той же переводческой единице? Тогда, не будет ли х видимым повсюду? Итак, какова роль статики сейчас?

Кроме того, существует ли использование static const int x, где x - глобальная переменная? По умолчанию не все константные глобальные переменные const? И является ли область ограничений const ограничена TU, даже если она ограничена в цикле for в файле?

4b9b3361

Ответ 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

В принципе, каждый исходный файл вместе со всеми включенными заголовочными файлами является отдельной единицей перевода. Итак, если у вас есть статическая переменная в файле заголовка, то она будет уникальной в каждом исходном файле (единица перевода), в который будет включен заголовочный файл.