Можно ли записать все включения в исходный файл?
Допустим, нам нужно написать модуль с именем 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?
Вы платите за то, что используете. Если вам нужно использовать (вызвать) функцию, ее объявление должно быть просмотрено заранее. Нет никакого способа обойти это. Вы можете либо объявить его вручную, добавив объявление функции, либо просто включив заголовочный файл с объявлением функции. Просто включите заголовки, которые необходимы.
Почему вы хотите это сделать? Какие преимущества были бы, если бы это было возможно?
Возможно ли для любой версии стандарта c включить это в исходный файл sum.c .
Во всех версиях стандарта C можно включить стандартный заголовок в исходный файл. На самом деле, это, возможно, рекомендуется.
Однако, если вы спрашиваете, можно ли избежать включения заголовка в sum.h, по-прежнему полагаясь на typedef (и не заставляя код, включающий sum.h, включать стандартный заголовок перед включением sum.h: плохой дизайн!), нет. нет стандартной версии C, где это возможно.
Любой из них подходит для стандарта C, если каждое включение выполняется до использования функции из включенного заголовка.
Кроме того, есть две школы стиля кодирования:
Либо включите все заголовки, используемые модулем, из файла .h, чтобы задокументировать зависимости файла модуля для пользователя.
Как правило, полезно сообщить пользователю вашего кода, какие заголовки необходимы программе для сборки. Есть несколько вещей, более разочаровывающих, чем включение какой-либо сторонней библиотеки в ваш код, а затем получение «загадочной ошибки компоновщика: 1», и оттуда вы понятия не имеете, почему - в лучшем случае проблема указывает где-то внутри включенной библиотеки.
Кроме того, сам файл заголовка может потребовать доступа к различным типам или константам во включенных файлах.
Или же включите все заголовки, используемые из файла .c, чтобы скрыть зависимости файлов.
Существуют сценарии, когда вы создаете библиотеку и хотите, чтобы пользователь взаимодействовал только с одним заголовочным файлом, скрывая от него внутреннюю файловую структуру библиотеки, подобно частной инкапсуляции. Возможно, вы не захотите предоставлять вызывающей стороне информацию о том, какие частные заголовки использует ваш код, особенно если вы связываете свой код с одним двоичным файлом lib (или DLL и т. д.).
Какой из этих стилей использовать, довольно субъективно, и, как указано выше, вы можете использовать один стиль вместо другого в зависимости от требований конкретного проекта.
Построение неявных зависимостей порядка включения исходных файлов — это автоматический запах кода. Ваш заголовок нуждается в
stdint.h
, включите его туда. Вы никогда не должны полагаться на исходный файл, включая ваш заголовок, чтобы включить какой-либо другой заголовок, от которого зависит ваш заголовок, до включения вашего заголовка.