Какой эффект делает статическую константу, имеют на участнике пространства имен

// MyClass.h

namespace MyNamespace {

  static const double GasConstant = 1.987;

  class MyClass
  {
    // constructors, methods, etc.
  };
}

Мне ранее объявили GasConstant в объявлении MyClass (и имел отдельное определение в исходном файле, так как C++ не поддерживает const инициализация нецелочисленных типов). Я однако должен получить доступ к нему из других файлов, и также логически кажется, что это должно находиться на уровне пространства имен.

Мои вопросы, что делает эффект static const имейте в этом случае? Очевидно const средства я не могу присвоить новое значение GasConstant, но что делает статического участника в среднем пространстве имен. Действительно ли это подобно помехам в объеме файла, где участник не доступен за пределами единицы?

15
задан James Hopkin 17 February 2016 в 15:11
поделиться

3 ответа

Использование static в области пространства имен равно * было объявлено устаревшим в C ++. Обычно его можно увидеть только в исходном файле, где его эффект заключается в том, чтобы сделать переменную локальной по отношению к этому исходному файлу. То есть другой исходный файл может иметь переменную с точно таким же именем без конфликта.

В C ++ рекомендуемый способ сделать переменные локальными по отношению к исходному файлу - использовать анонимное пространство имен.

Я думаю, будет справедливо сказать, что static в заголовке вашего кода просто неверно.

* Как указал Том в комментариях (и в этом ответе ), комитет по C ++ отменил решение об исключении использования статического в области видимости файла на том основании, что это использование всегда будет частью языка (например, для совместимости с C).

7
ответ дан 1 December 2019 в 04:40
поделиться

Если это файл заголовка, то static в этом случае не действует. Объекты const уже имеют внутреннюю привязку по умолчанию в C ++, поэтому не имеет значения, объявляете ли вы его с помощью static или без static .

Я предполагаю, что вы просто переместили объявление из класса в пространство имен. Но static имеет совершенно другое значение в контексте объявления класса и в контексте пространства имен. Внутри класса вам понадобится static . В пространстве имен статический является лишним.

2
ответ дан 1 December 2019 в 04:40
поделиться

MSDN говорит:

При модификации переменной ключевое слово static указывает, что переменная переменная имеет статическую длительность (она выделяется при начале программы и деаллокация при завершении программы) и инициализирует ее в 0, если не указано другое если не указано другое значение. При изменении переменной или функции в области видимости файла, ключевое слово static указывает, что переменная или функция имеет внутреннюю связь (ее имя не видно за пределами файла, в котором она объявлена).

Помните, что включение заголовочных файлов означает замену директивы "#include"-директивы на собственно код заголовочного файла. Таким образом, статические переменные будут видны только в файле ".cpp" (который компилируется), включающем два заголовочных файла.

Таким образом, каждый "cpp"-файл, включающий заголовочные файлы, будет иметь свою собственную статическую переменную.

4
ответ дан 1 December 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: