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