Как статический констант влияет на член пространства имен - PullRequest
15 голосов
/ 21 мая 2010
// MyClass.h

namespace MyNamespace {

  static const double GasConstant = 1.987;

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

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

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

Ответы [ 3 ]

7 голосов
/ 21 мая 2010

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

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

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

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

4 голосов
/ 21 мая 2010

MSDN говорит:

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

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

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

2 голосов
/ 21 мая 2010

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

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

...