Подтвердить что ты не робот

Причины использования статических функций и переменных в C

Интересно, как использовать ключевое слово static как ограничение по объему для переменных в файле, в C.

Стандартный способ создания программы на C, как я вижу, заключается в следующем:

  • есть куча c файлов, определяющих функции и переменные, возможно, область ограничена static.
  • есть куча h файлов, объявляющих функции и, возможно, переменные соответствующего c файла, для других файлов c. Частные функции и переменные не публикуются в файле h.
  • каждый файл c скомпилирован отдельно в файл o.
  • все файлы o связаны между собой файлом приложения.

Я вижу две причины для объявления gobal как static, если переменная не публикуется в h файле:

  • один для удобства чтения. Информируйте будущих читателей, включая меня, что переменная недоступна в любом другом файле.
  • второй заключается в том, чтобы другой файл c не обновлял переменную как extern. Я полагаю, что компоновщику будет не нравиться переменная, являющаяся как extern, так и static. (Мне не нравится идея обновления файла переменной, принадлежащей кому-либо, как extern, это нормально?)

Любая другая причина?

То же самое относится к функциям static. Если прототип не опубликован в файле h, другие файлы могут вообще не использовать эту функцию, поэтому зачем вообще определять его static? Я вижу две причины, но не более.

4b9b3361

Ответ 1

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

Переопределение переменной static как extern невозможно, но компилятор (как обычно) даст вам достаточно веревки, чтобы повесить себя.

Если я пишу static int foo; в одном файле и int foo; в другом, они считаются разными переменными, несмотря на то, что они имеют одинаковое имя и тип - компилятор не будет жаловаться, но вы, вероятно, будете очень растеряны позже, пытаясь прочитать и/или отлаживать код. (Если я напишу extern int foo; во втором случае, это не удастся связать, если я не объявляю нестатический int foo; где-то еще.)

Глобальные переменные редко появляются в заголовочных файлах, но когда они это делают, они должны быть объявлены extern. Если нет, в зависимости от вашего компилятора, вы рискуете, что каждый исходный файл, который включает этот заголовок, будет объявлять свою собственную копию переменной: в лучшем случае это приведет к сбою связи (многоточечный символ) и, в худшем случае, несколько запутанных случаев омрачения.

Ответ 2

Объявляя переменную static на уровне файла (static внутри функции имеет другое значение), вы запрещаете другим устройствам обращаться к ней, например. если вы попытаетесь использовать переменную внутри другого устройства (объявлено с помощью extern), компоновщик не найдет этот символ.

Ответ 3

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

Ответ 4

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

Ответ 5

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

Если вы пишете функцию foo() в файле ac, не делая ее статичной, а функцию foo() в файле bc, не делая ее статической, компоновщик может жаловаться, но если это не так, все вызовы foo ( ) вызовет ту же функцию. Ожидайте отладки вашего кода.

Ответ 6

Мое любимое использование статики - это возможность хранить методы, которые мне не нужны для ввода или создания объекта для использования, как я его вижу, Частные статические методы всегда полезны, где public static вы должны добавить еще несколько время, когда вы думаете о том, что именно вы делаете, чтобы избежать того, что было определено crazyscot, поскольку вы слишком много веревки и случайно висели сами!

Мне нравится держать папку для классов Helper для большинства моих проектов, которые в основном состоят из статических методов для быстрого и эффективного выполнения на лету, никаких объектов не требуется!