Я читал, что разница между глобальными и статическими глобальными значениями заключается в том, что глобальную переменную можно ссылаться в другом файле реализации через extern, тогда как статические глобальные локали локализованы только для этого файла реализации. См. Эти два вопроса для получения дополнительной информации: [1, 2].Статический член vs static global
Из чего я понимаю, это означает, что следующие foo()
и bar()
должны быть связаны одинаково. Обе функции могут использоваться только MyClass
.
//MyClass.h
Class MyClass{
private:
static void foo();
};
//MyClass.cpp
void MyClass::foo(){}
static void bar(){}
Я могу видеть foo()
«s заявление является более распространенным, так как она позволяет заголовочный файл выложить весь класс более полно (даже если вы не можете/не должны использовать личные вещи), но плохо практика объявляет функцию вроде bar()
(скрыта от файла заголовка)?
Для контекста я определяю WNDPROC
для сообщений Windows, которые должны быть статичными для работы, но это довольно уродливое объявление, и я не уверен, должен ли я полностью скрыть его в файле реализации или продолжить это в файле заголовка.
Это не плохая практика, это хорошая * практика. Чем меньше символов должен обрабатывать компоновщик, тем быстрее он будет работать и тем меньше вероятность несчастных случаев. Процедура окна, конечно, не должна быть видимой за пределами файла исходного кода, это чистая деталь реализации окна. –
@HansPassant, так зачем вообще нужно объявлять какие-либо частные статические функции-члены? Разве все они не были бы чистыми деталями реализации во всех случаях?А как насчет других частных статических переменных-членов (в отличие от функций), которые также используются в качестве чистой детали реализации? – Suedocode
Я вижу, куда вы идете. Это немного раздражает, чтобы вставить файл заголовка, который вы можете использовать только в одном исходном файле. Однако смысл не идентичен, как я объяснил в своем другом комментарии. –