Эта путаница обычно возникает из-за того, что ключевое слово static
служит двум целям.
При использовании на уровне файла он управляет видимостью своего объекта за пределами модуля компиляции, а не продолжительностью объекта (видимость и продолжительность - это термины непрофессионала, которые я использую во время учебных занятий. , стандарт ISO использует разные термины, которые вы, возможно, захотите выучить, но я обнаружил, что они сбивают с толку большинство начинающих студентов).
Для объектов, созданных на уровне файлов, уже определена их продолжительность в силу того факта, что они находятся на уровне файлов. Ключевое слово static
тогда просто делает их невидимыми для компоновщика.
При использовании внутри функций он контролирует продолжительность, а не видимость. Видимость уже определена, поскольку она находится внутри функции - ее нельзя увидеть вне функции. Ключевое слово static
в этом случае вызывает создание объекта одновременно с объектами уровня файла.
Обратите внимание, что технически статика уровня функции может не обязательно появляться до тех пор, пока функция не будет впервые вызвана (и это может иметь смысл для C ++ с его конструкторами), но каждая реализация C, которую я когда-либо использовал, создает свою статику уровня функции одновременно time как объекты файлового уровня.
Кроме того, хотя я использую слово «объект», я не имею в виду его в смысле объектов C ++ (поскольку это вопрос C). Просто потому, что static
может применяться к переменным или функциям на уровне файла, и мне нужно всеобъемлющее слово, чтобы описать это.
Статика функционального уровня все еще используется довольно часто - они могут вызвать проблемы в многопоточных программах, если это не обслуживается, но при условии, что вы знаете, что делаете (или не используете потоки), они лучший способ сохранять состояние при нескольких вызовах функций, при этом обеспечивая инкапсуляцию.
Даже с потоковой передачей в функции можно использовать уловки (например, выделение данных для конкретного потока внутри функции), чтобы сделать ее работоспособной, не подвергая без надобности внутреннюю часть функции.
Единственные другие варианты, о которых я могу думать, - это глобальные переменные и передача «переменной состояния» функции каждый раз.
В обоих этих случаях вы открываете внутреннюю работу функции ее клиентам и делаете функцию зависимой от хорошего поведения клиента (всегда рискованное предположение).
person
paxdiablo
schedule
11.02.2009