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

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

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

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

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

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

Какая-либо другая причина?

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

26
задан Gauthier 4 June 2010 в 12:56
поделиться

5 ответов

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

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

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

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

26
ответ дан 28 November 2019 в 07:18
поделиться

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

9
ответ дан 28 November 2019 в 07:18
поделиться

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

1
ответ дан 28 November 2019 в 07:18
поделиться

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

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

-1
ответ дан 28 November 2019 в 07:18
поделиться

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

8
ответ дан 28 November 2019 в 07:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: