Статические функции вне классов
Может ли кто-нибудь сказать мне, что цель объявления статических функций вне классов? Какая разница между этими двумя? Существуют ли какие-либо преимущества для использования статики в этой ситуации?
static void someRandomFunction();
int main()
{
someRandomFunction();
return 0;
}
а также
void someRandomFunction();
int main()
{
someRandomFunction();
return 0;
}
Ответы
Ответ 1
В области пространства имен static
дает имя внутренней связи, что означает, что оно доступно только в пределах единицы перевода, которая содержит определение. Без static
он имеет внешнюю связь и доступен в любой единицы перевода.
Поэтому при написании функции, предназначенной только для использования в этом устройстве, вы должны использовать static
(или, альтернативно, неназванное пространство имен); внутренняя связь означает, что другие единицы могут определять разные функции с тем же именем, не вызывая конфликтов имен.
Нестатические функции (и глобальные имена в целом) лучше объявляются в заголовке, чтобы убедиться, что каждая единица перевода, которая их использует, получает одно и то же объявление.
Ответ 2
static
ключевое слово по глобальным функциям или переменным ограничивает видимость и область связи функции или переменной текущей единицей перевода.
Это означает, что для функции она может быть вызвана только из текущего исходного файла, а не из других исходных файлов.
Ответ 3
static
функция остается видимой только в области файлов. Это функция C.
Рекомендуемым способом сделать это в C++ является использование анонимного пространства имен, как в:
namespace // no name, i.e. anonymous
{
static void someRandomFunction();
}
int main()
{
someRandomFunction(); // visible only within this file.
return 0;
}
Обратите внимание, что тело функции также должно быть объявлено где-то внутри одного и того же файла, так как компоновщик не будет пытаться найти его в других (внешних) единицах перевода.
Таким образом, static void someRandomFunction();
на самом деле является прямым объявлением для функции, определенной в другом месте в том же файле (то есть в той же единице перевода).
Если функция фактически вызвана, вы получите ошибку связывания, если тело функции не определено в том же файле.
Ответ 4
static void someRandomFunction();
Это должно использоваться в пределах той же единицы компиляции (исходный файл) и вне этого блока компиляции, недоступной для использования. Если у вас есть
void someRandomFunction();
с одним определением в рамках программы, эта функция может использоваться любым модулем компиляции во всем мире по всей программе
Ответ 5
Статические методы и статические функции - это совершенно разные вещи.
Статические методы - это методы класса вместо экземпляра (который вы уже знаете, как кажется).
С другой стороны, статические функции - это функция, доступная только в модуле, в котором они определены. Они не экспортируются и не могут быть помещены в файл заголовка и использованы в другом c файле. Таким образом, вы можете писать разные функции, имеющие одно и то же имя, а также компилятор может более тщательно оптимизировать ваш код, введя в действие функцию, зная, что никакой другой файл не зависит от нее.
Ответ 6
static
указывает, что компилятор не добавляет эту функцию в таблицу символов для объектного файла. Это фактически означает, что ссылка не может найти функцию, которая, в свою очередь, означает, что вы можете использовать эту функцию непосредственно в текущем блоке компиляции. Однако вы можете вызвать статические функции из другого модуля компиляции, если это делается с помощью указателя функции.