Почему мы должны включать заголовочный файл в тот же исходный код, где мы реализовали функции?

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

скажем, в файле file.c я хочу назвать прототипы заголовков myheader.h . Затем я должен включить заголовок #include "myheader.h" в file.c, что понятно. но почему я не могу понять, так это то, что я должен включить его и в файл определения прототипа proto_source.c:

/**
* THE PROTYPES DEFINITION SOURCE proto_source.c
*/

#include "myheader.h" //what this include is doing here?

void foo(void)
{
    ....
}

Какая логика стоит за этим?

Просто компилятор также проверяет соответствие определения функции прототипу, который находится в заголовочном файле, и сообщает о несоответствиях. Все должны согласиться с типом и количеством параметров и возвращаемым значением.

Fe2O3 20.07.2023 01:38

@ Fe2O3 Fe2O3, это было проницательно, но не могли бы вы объяснить подробнее или отослать меня к более подробному источнику по этому вопросу?

elakhdar_ayoub 20.07.2023 01:40

Вы проверяли, что происходит, когда вы оставляете его выключенным?

JohnFilleau 20.07.2023 02:13

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

pmacfarlane 20.07.2023 02:18

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

pmacfarlane 20.07.2023 02:22

Учитывая вашу настройку, он строится. И foo вызывается из file.c с foo(). Теперь вы редактируете proto_source.c и меняете на void foo(struct baz *ptr) { ptr->val = 5; }. Но вы не меняете .h. Теперь вызов foo неверен, и foo будет segfault во время выполнения. Однако без «оскорбления» #includeproto_source.c) он будет строиться чисто. При включении несоответствие прототипа будет обнаружено во время компиляции.

Craig Estey 20.07.2023 02:43

Связанный: stackoverflow.com/a/56961715/6699433

klutt 20.07.2023 02:47

Заголовки — это связующее звено, скрепляющее программу на C. Заголовки позволяют потребителям набора библиотечных функций узнать, что такое интерфейсы. Включение заголовков в реализацию обычно необходимо (например, если есть типы структур или перечисления и т. д.) и перекрестная проверка того, соответствует ли реализация обещанным заголовкам. В C99 или более поздних версиях у вас должно быть объявление каждой функции, доступное перед ее вызовом, а объявление ее в заголовке избавляет вас от многократного написания объявления, обеспечивает согласованность и позволяет избежать проблем с множественным обслуживанием.

Jonathan Leffler 20.07.2023 04:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме

Как разделить циклическую зависимость с помощью директивы «using»
Почему это дает мне ошибку «Использует неопределенную структуру», когда структура четко определена?
Типст: заголовок, который меняется от страницы к странице в зависимости от состояния
Как я могу прочитать значение из заголовка в Azure API Management и передать его в параметр пути в области keycloak?
Как обновить/изменить заголовки запросов и параметры запроса в промежуточном программном обеспечении FastAPI?
Является ли потенциально проблематичным включение файлов #include после пользовательских токенов?
Заголовок MAUI CollectionView не отображается
Excel VBA Right Header устанавливает размер шрифта на 20 - Excel решает, что размер 409 лучше
Зачем нам нужны файлы заголовков в C, когда мы можем использовать «внешние» идентификаторы?
Как отображать верхний и нижний колонтитулы на другой странице, кроме «Домашней»?