Допустим, у нас есть несколько исходных файлов C, таких как file1.c
, file2.c
и main.c
. У нас есть следующие функции:Должен ли прототип функции всегда находиться в файле заголовка?
file1.c
|---> file1Func1()
|---> file1Func2()
file2.c
|---> file2Func1()
|---> file2Func2()
и главный файл использует эти функции. Теперь было бы естественно, что я создаю и добавляю соответствующий прототип функции в заголовочные файлы file1.h
и file2.h
, затем включим эти заголовки в main.c
для использования этих функций.
Что делать, если у меня есть очень большой проект с более чем тысячами исходных (C) файлов, должен ли я всегда создавать заголовок (а затем добавить прототип функции) для каждого исходного файла. Затем включить заголовок для использования функций?
Или с использованием extern для использования функции, определенной в другом месте (в другом исходном файле), и полагаться на компоновщик для поиска и извлечения функции из объектного файла во время ссылки?
Примечание: использование последнего подхода вызывает предупреждение MISRA о отсутствии прототипа функции.
Хотя я согласен с вами относительно эквивалентности, я предпочитаю видеть ключевое слово 'extern', поскольку это явно показывает глобальную природу. Имейте в виду, я предпочитаю терминологию C++ публичного/частного над extern/static – Andrew
@Andrew Это в основном вопрос стиля. Некоторым нравится быть явным, некоторые считают, что это лишнее. Однако в будущих языках языка C11 говорится, что «объявление идентификатора с внутренней связью в области файлов без статического класса хранения спецификатор является устаревшей функцией». Поэтому я предполагаю, что в будущих стандартах C мы не сможем объявлять функции без использования extern. Я очень сомневаюсь, что комитет посмеет принять этот шаг, хотя, так как он сломает так много существующего кода. Я думаю, что здесь обоснование состоит в том, чтобы запретить такие идентификаторы типа объекта, то есть: «глобальные». – Lundin
Действительно ... и есть более важные вещи, которые нужно исправить, несмотря на одержимость WG14 с обратной совместимостью! – Andrew