Как сделать все включения в исходный файл?

Можно ли записать все включения в исходный файл?

Допустим, нам нужно написать модуль с именем sum (sum.h/sum.c), который предоставляет функции суммирования для всех числовых типов.

Все объявления функций выполняются в файле sum.h следующим образом:

uint16_t sum(uint16_t a, uint16_t b); // uint16 sum function

в этом случае я должен включить <stdint.h> в sum.h.

Возможно ли для любой версии стандарта C включить это в исходный файл sum.c?

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

WhozCraig 27.10.2022 10:41

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

Jason Liam 27.10.2022 10:49

Почему вы хотите это сделать? Какие преимущества были бы, если бы это было возможно?

Jabberwocky 27.10.2022 11:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
3
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Возможно ли для любой версии стандарта c включить это в исходный файл sum.c .

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

Однако, если вы спрашиваете, можно ли избежать включения заголовка в sum.h, по-прежнему полагаясь на typedef (и не заставляя код, включающий sum.h, включать стандартный заголовок перед включением sum.h: плохой дизайн!), нет. нет стандартной версии C, где это возможно.

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

Кроме того, есть две школы стиля кодирования:

  • Либо включите все заголовки, используемые модулем, из файла .h, чтобы задокументировать зависимости файла модуля для пользователя.

    Как правило, полезно сообщить пользователю вашего кода, какие заголовки необходимы программе для сборки. Есть несколько вещей, более разочаровывающих, чем включение какой-либо сторонней библиотеки в ваш код, а затем получение «загадочной ошибки компоновщика: 1», и оттуда вы понятия не имеете, почему - в лучшем случае проблема указывает где-то внутри включенной библиотеки.

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

  • Или же включите все заголовки, используемые из файла .c, чтобы скрыть зависимости файлов.

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

Какой из этих стилей использовать, довольно субъективно, и, как указано выше, вы можете использовать один стиль вместо другого в зависимости от требований конкретного проекта.

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