Как правило кодирования, которому я следую, любая функция (кроме 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
(поэтому, если компиляция выдает предупреждение, компиляция завершается неудачно). Я мог бы использовать его больше, чем я, так как мой код компилируется без предупреждений - или исправляется так, что он делает.
Итак, вы могли бы легко посмотреть на мой код. В моем коде единственные функции, которые предоставляются - даже в программах с одним исходным файлом - это функции, которые объявлены в заголовке, что означает, что они являются частью внешнего интерфейса модуля, который представляет исходный файл.