Какое влияние оказывает статическая константа на член пространства имен

// MyClass.h

namespace MyNamespace {

  static const double GasConstant = 1.987;

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

Ранее я объявлял GasConstant в объявлении MyClass (и имел отдельное определение в исходном файле, поскольку С++ не поддерживает инициализацию нецелого типа const). Однако мне нужно получить к нему доступ из других файлов, а также логически, похоже, что он должен находиться на уровне пространства имен.

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

MSDN говорит:

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

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

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

Ответ 3

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

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