// MyClass.h
namespace MyNamespace {
static const double GasConstant = 1.987;
class MyClass
{
// constructors, methods, etc.
};
}
Мне ранее объявили GasConstant в объявлении MyClass (и имел отдельное определение в исходном файле, так как C++ не поддерживает const
инициализация нецелочисленных типов). Я однако должен получить доступ к нему из других файлов, и также логически кажется, что это должно находиться на уровне пространства имен.
Мои вопросы, что делает эффект static const
имейте в этом случае? Очевидно const
средства я не могу присвоить новое значение GasConstant, но что делает статического участника в среднем пространстве имен. Действительно ли это подобно помехам в объеме файла, где участник не доступен за пределами единицы?
Использование static
в области пространства имен равно * было объявлено устаревшим в C ++. Обычно его можно увидеть только в исходном файле, где его эффект заключается в том, чтобы сделать переменную локальной по отношению к этому исходному файлу. То есть другой исходный файл может иметь переменную с точно таким же именем без конфликта.
В C ++ рекомендуемый способ сделать переменные локальными по отношению к исходному файлу - использовать анонимное пространство имен.
Я думаю, будет справедливо сказать, что static
в заголовке вашего кода просто неверно.
* Как указал Том в комментариях (и в этом ответе ), комитет по C ++ отменил решение об исключении использования статического
в области видимости файла на том основании, что это использование всегда будет частью языка (например, для совместимости с C).
Если это файл заголовка, то static
в этом случае не действует. Объекты const
уже имеют внутреннюю привязку по умолчанию в C ++, поэтому не имеет значения, объявляете ли вы его с помощью static
или без static
.
Я предполагаю, что вы просто переместили объявление из класса в пространство имен. Но static
имеет совершенно другое значение в контексте объявления класса и в контексте пространства имен. Внутри класса вам понадобится static
. В пространстве имен статический
является лишним.
MSDN говорит:
При модификации переменной ключевое слово static указывает, что переменная переменная имеет статическую длительность (она выделяется при начале программы и деаллокация при завершении программы) и инициализирует ее в 0, если не указано другое если не указано другое значение. При изменении переменной или функции в области видимости файла, ключевое слово static указывает, что переменная или функция имеет внутреннюю связь (ее имя не видно за пределами файла, в котором она объявлена).
Помните, что включение заголовочных файлов означает замену директивы "#include"-директивы на собственно код заголовочного файла. Таким образом, статические переменные будут видны только в файле ".cpp" (который компилируется), включающем два заголовочных файла.
Таким образом, каждый "cpp"-файл, включающий заголовочные файлы, будет иметь свою собственную статическую переменную.