Это хорошая идея, чтобы поместить все ваши включения в один заголовочный файл? - PullRequest
8 голосов
/ 28 февраля 2011

Какова лучшая практика для C, которую вы помещаете в заголовочный файл C?

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

Как насчет включений, которые используются практически в каждом файле (например, stdio.h)?

Ответы [ 7 ]

12 голосов
/ 28 февраля 2011

Нет.Это просто добавляет кавычки и накладные расходы.

Одна из самых больших проблем, с которой вы столкнетесь как сопровождающий, - это выяснить, какие заголовки не необходимо включить и избавиться от них.Когда вы попадаете в список из 20+ заголовков, вы начинаете созерцать уродливые вещи , такие как грубое форсирование (удаляя по одному за раз и проверяя, не сломалось ли что-либо).кто должен поддерживать ваши вещи в будущем.Используйте заголовки, которые вам нужны для каждого модуля, не более .. не менее:)

3 голосов
/ 18 сентября 2011

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

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

Это затрудняет тестирование.

Но самая большая проблема заключается в том, что она представляет интеллектуальную лень и поощряет то же самое.

Как и все вопросы программирования, делайте то, что нужно, не больше, не меньше.Подумайте об обслуживании.Подумайте об управлении сборкой.

Просто ДУМАЙ.

3 голосов
/ 28 февраля 2011

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

Представьте, что у вас есть заголовок MyHeader.h. Если вы вносите в него изменения, которые требуют изменения кода, который опирается на него, легко найти этот зависимый код, если в каждом файле, который его использует, есть #include "MyHeader.h" - вы можете просто выполнить глобальный поиск для оператора включения.

Если, с другой стороны, вы включаете только MyHeader.h в какой-то другой заголовок MyHugeHeader.h, а затем включаете , что в ваши файлы, вы не можете сделать то же самое, поскольку все, что находится в файлах используйте MyHeader.h, равный #include "MyHugeHeader.h", так же, как и любой другой файл.

2 голосов
/ 28 февраля 2011

Некоторые вещи, которые еще не указаны:

  • ненужные зависимости увеличивают время компиляции. Когда вы изменяете заголовок, вам придется перекомпилировать все модули компиляции, которые включают его прямо или косвенно. Если включение не требуется, перекомпиляция также не требуется. Чем больше ваша программа, тем больше будет проблема, особенно если вы разбили свои программы на композиты, перекомпиляцию которых вы должны запускать вручную.

  • заголовки прекомпилятора могут быть более эффективными при добавлении ненужных зависимостей.

1 голос
/ 28 февраля 2011

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

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

1 голос
/ 28 февраля 2011

Личные предпочтения действительно ... Неважно, как он отформатирован, если вы последовательны (что облегчает чтение). Вы можете поместить все это в 1 заголовочный файл или просто поместить его в каждый файл, который в этом нуждается. Это также зависит от того, как загружаются другие включения, если что-то приходит после того, как основному не требуется его включение, и так далее, поэтому использование одного и того же заголовочного файла для ВСЕХ ваших других файлов C может включать или не включать (зависит от компилятора) одно и то же включение раз.

Редактировать: Я тоже должен согласиться с Mac, положить его туда, где вы используете, это очень, очень хорошая вещь, чтобы сделать также

0 голосов
/ 28 февраля 2011

Заголовочный файл - это то, что вы включаете в свою программу на c. Он содержит структуры данных, такие как структуры, макросы, определения функций и т. Д. Иногда один заголовочный файл может быть в порядке, но если ваша программа вырастет в логические компоненты, вам может понадобиться больше.

...