Статические функции вне классов

Может ли кто-нибудь сказать мне, что цель объявления статических функций вне классов? Какая разница между этими двумя? Существуют ли какие-либо преимущества для использования статики в этой ситуации?

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 указывает, что компилятор не добавляет эту функцию в таблицу символов для объектного файла. Это фактически означает, что ссылка не может найти функцию, которая, в свою очередь, означает, что вы можете использовать эту функцию непосредственно в текущем блоке компиляции. Однако вы можете вызвать статические функции из другого модуля компиляции, если это делается с помощью указателя функции.