в чем преимущество статической функции? - PullRequest
5 голосов
/ 19 октября 2011

см. В одном исходном коде проекта, который я видел ниже декларации

static int *foo();

поэтому он объявляет foo как статическую функцию, возвращающую указатель на int. Итак, здесь я хочу спросить вас, какова цель объявления функции как статической?

Ответы [ 5 ]

9 голосов
/ 19 октября 2011

Имя функции не отображается за пределами модуля перевода (исходного файла), в котором она объявлена, и не будет конфликтовать с другой функцией foo в другом исходном файле.

В общем, функции, вероятно, должны быть объявлены static, если у вас нет особой необходимости вызывать его из другого исходного файла.

(Обратите внимание, что только имя невидимо. Его по-прежнему можно вызывать из любой точки программы через указатель.)

2 голосов
/ 19 октября 2011

Из стандарта C99:

6.2.2 Связи идентификаторов

Если объявление идентификатора области файла для объекта или функции содержит статический спецификатор класса хранения, идентификатор имеет внутреннюю связь.

и

В наборе единиц перевода и библиотек, составляющих целую программу, каждая объявление определенного идентификатора с внешней связью обозначает тот же объект или функция. В пределах одной единицы перевода каждое объявление идентификатора с внутренним связь обозначает тот же объект или функцию. Каждое объявление идентификатора без связь обозначает уникальную сущность.

2 голосов
/ 19 октября 2011

Запрещает другим функциям перевода (файлам .c) видеть функцию. Содержит вещи в чистоте и порядке. Функция без static по умолчанию extern (видна другим модулям).

1 голос
/ 19 октября 2011

Пометка функции или глобальной переменной как static делает ее невидимой для компоновщика после компиляции текущей единицы перевода в объектный файл.

Другими словами, она имеет только внутреннюю связь с текущимпереводческий блок.Если не использовать static или явно использовать спецификатор класса хранения extern, символ имеет внешнюю связь.

1 голос
/ 19 октября 2011

Объявление функции как static предотвращает доступ к ней других файлов.Другими словами, он виден только для файла, в котором он был объявлен;"локальная" функция.

Вы также можете связать static (ключевое слово объявления функции, не переменная) в C как private в объектно-ориентированных языках.

См. здесь для примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...