Почему до ВСЕХ функций (кроме main ()) есть ключевое слово «static»? - PullRequest
4 голосов
/ 08 февраля 2010

Я читал некоторые файлы исходного кода на C и C ++ (в основном на C) ... Я знаю, что значение ключевого слова static состоит в том, что статические функции - это функции, которые видны только другим функциям в том же файле. В другом контексте, который я прочитал, приятно использовать статические функции в тех случаях, когда мы не хотим, чтобы они использовались вне файла, в котором они написаны ...

Я читал один файл исходного кода, как я упоминал ранее, и я увидел, что ВСЕ функции (кроме основной) были статическими ... Потому что нет других дополнительных файлов, связанных с основным файлом исходного кода .c (не четные заголовки), логически, почему я должен ставить статические перед всеми функциями? От ЧЕГО они должны быть защищены, когда есть только 1 исходный файл?!

РЕДАКТИРОВАТЬ: ИМХО Я думаю, что эти ключевые слова ставятся только для того, чтобы код выглядел больше и тяжелее ..

Ответы [ 6 ]

16 голосов
/ 08 февраля 2010

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

Если функция static, то это дает компилятору большую гибкость. Например, оптимизатор может решить встроить функцию; при static компилятору не нужно генерировать дополнительную копию вне строки. Кроме того, таблица символов будет меньше, возможно, ускоряя процесс связывания.

Кроме того, это просто хорошая привычка.

5 голосов
/ 08 февраля 2010

Трудно догадаться в отдельности, но я предполагаю, что он был написан кем-то, кто предполагает, что в какой-то момент может быть добавлено больше файлов * (или этот файл включен в другой проект), поэтому дает наименее необходимый доступ для работы кода. По сути, ограничение публичного API до минимума.

3 голосов
/ 08 февраля 2010

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

Если функция используется только внутри одного исходного файла, она должна быть статической. Это значительно облегчает изменение; вы знаете, что единственное место, где вам нужно посмотреть, чтобы увидеть, как оно используется, - это исходный файл, который у вас есть сейчас (если вы не привыкли включать файлы .c в другие файлы .c, что также дурная привычка, которую сейчас нужно сломать).

Я использую GCC для обеспечения соблюдения правила кодирования:

gcc -m64 -Wall -Wextra -std=c99 -Wmissing-prototypes -Wstrict-prototypes

Это довольно типичная коллекция флагов; Я иногда использую -std=c89 вместо -std=c99; Я иногда использую -m32 вместо -m64; Я не всегда использую -Wextra (но мой код движется в этом направлении). I всегда использует -Wmissing-prototypes и -Wstrict-prototypes, чтобы гарантировать, что каждая внешняя функция объявлена ​​до того, как она определена или используется (и каждая статическая функция либо объявлена, либо определена до ее использования). Я иногда использую -Werror (поэтому, если компиляция выдает предупреждение, компиляция завершается неудачно). Я мог бы использовать его больше, чем я, так как мой код компилируется без предупреждений - или исправляется так, что он делает.

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

3 голосов
/ 08 февраля 2010

Но есть и другие файлы, связанные с вашим основным модулем.

На самом деле, в библиотеках есть сотни или даже тысячи. Большинство из них не будут выбраны для небольшой программы, но все символы сканируются компоновщиком. Столкновение между символом в главном и экспортированным из библиотеки символом само по себе не причинит никакого вреда, но подумайте о проблеме, если случайно назвать что-то strcpy().

Кроме того, вероятно, не помешает привыкнуть к лучшим стилям.

2 голосов
/ 08 февраля 2010

Возможно, автор принимает меры предосторожности. Например, если кто-то еще использует этот файл в качестве источника, включив его в свой основной файл.

0 голосов
/ 08 февраля 2010

Потому что нет других дополнительных файлы, связанные с основным исходным кодом Файл .c (даже не заголовки), логически почему я должен ставить статический перед всеми функции? Из чего они должны быть защищен, когда есть только 1 источник файл?! * * 1002

Вам, честно говоря, не нужно ключевое слово static в этом случае.

РЕДАКТИРОВАТЬ: ИМХО я думаю, что эти ключевые слова ставятся просто для того, чтобы код выглядел больше и тяжелее

Однако, если вы действительно хотите узнать больше о ключевом слове static, вы можете начать с книги. Дополнительная информация по ключевому слову static на # 2216239 - может помочь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...