Как создать файл, содержащий все включения?

#c #header #include

#c #заголовок #включить

Вопрос:

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

Выполнение #ifndef или #pragma один раз также не поможет. Есть ли какой-либо другой умный способ добиться этого?

Спасибо

Комментарии:

1. «Это, конечно, создает проблему бесконечного цикла, когда заголовок включается в заголовок, который включает тот же заголовок». Это не должно? » Выполнение #ifndef или #pragma один раз также не поможет». Почему бы и нет?

2. Это довольно распространенная вещь: любой, у кого есть предварительно скомпилированные заголовки, делает это!

3. Я делал это десятилетиями, используя предварительно скомпилированные заголовки. Хотя с учетом сказанного все еще есть вещи, которые вы не помещаете в предварительно скомпилированный заголовок. Он предназначен для вставки заголовков, которые не меняются или меняются не часто, поскольку перекомпиляция предварительно скомпилированного заголовка может занять несколько минут в зависимости от вашего проекта.

4. Предположим, что «superheader.h» имеет «A.h» и «B.h». В «A.h» я включаю «superheader.h» и делаю то же самое в «B.h». Если у меня есть «superheader.h», защищенный с помощью #paragma один раз, похоже, что он включен либо в «A.h», либо в «B.h» (предположим, что «A.h» компилируется первым). Внутренние конструкции «B.h» продолжают ворчать, что он не знает, что такое «A.h» внутренняя функция / переменная / и т.д. являются.

Ответ №1:

Это, конечно, создает проблему бесконечного цикла, когда заголовок включается в заголовок, который включает тот же заголовок.

Просто исключите «суперзаголовок» из набора заголовков, которые включает «суперзаголовок». Таким образом, вы не столкнетесь с проблемой.

Тем не менее, выполнение этого, вероятно, приведет к тому, что единицы перевода, включая «superheader», будут включать заголовки без необходимости, что может отрицательно повлиять на время компиляции. Таким образом, я не рекомендую этот подход.

Комментарии:

1. Знаете ли вы хороший подход, помимо простого включения всего, что необходимо, в каждый файл?