Зачем объявлять переменную или функцию static в C?

Я понимаю, что статично, но не почему мы его используем. Это только для сохранения уровня абстракции?

Ответы

Ответ 1

Есть несколько причин использовать static в C.

При использовании с функциями да, это намерение для создания абстракции. Первоначальным термином для объема файла исходного кода C была "единица перевода". Статические функции могут быть достигнуты только из одной и той же единицы перевода. Эти статические функции похожи на частные методы на С++, либерально интерпретируемые (в этой аналогии единица перевода определяет класс).

Статические данные на глобальном уровне также недоступны извне единицы перевода, и это также используется для создания абстракции. Кроме того, все статические данные инициализируются до нуля, поэтому static может использоваться для управления инициализацией.

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

Ответ 2

Ключевое слово static имеет несколько применений; Вне функции он просто ограничивает видимость функции или переменной для блока компиляции (файл .c), в котором происходит функция или переменная. Таким образом, функция или переменная не становятся глобальными. Это хорошо, он способствует своего рода принципу "нужно знать" (не подвергайте вещи, которые не нужно раскрывать). Статические переменные этого типа инициализируются нулем, но, конечно, глобальные переменные также ноль инициализируются, поэтому статическое ключевое слово не отвечает за нулевую инициализацию как таковую.

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

Ответ 3

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

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