В пространстве имен C ++ имеет ли какой-либо эффект статический классификатор при добавлении префиксов, не являющихся членами, объявленных в заголовке? - PullRequest
1 голос
/ 25 января 2012

Рассмотрим:

namespace JohnsLib {
    static bool foobar();
    bool bar();
}

Какое значение имеет static здесь?

Ответы [ 4 ]

5 голосов
/ 25 января 2012

Изменяет связь с «внешней» на «статическую», делая ее невидимой для компоновщика и не применимой для других модулей компиляции.(Хорошо, если другие блоки компиляции также включают заголовок, они получают свою собственную отдельную копию)

3 голосов
/ 25 января 2012

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

namespace JohnsLib
{
    namespace
    {  
         bool foobar() {definition here, won't cause redefinition errors}
    }
    bool bar();
}
1 голос
/ 25 января 2012

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

0 голосов
/ 26 января 2012

В языке программирования C ++ Бьярне заявляет, что в программах на C и C ++

ключевое слово static (смешанно) используется для обозначения «использовать внутреннюю связь».Не используйте static , кроме как внутри функций и классов.

В Sutter / Alexandrescu C ++ Стандарты кодирования C 61 - "Не определяйте объекты со связью в заголовкефайл. "

...