Зачем сначала включать связанный заголовок?

К вопросу C/C++ относятся порядок файлов/лучшие практики, лучший ответ рекомендует сначала включить связанный заголовок.

То же самое для руководств по стилю Google и Mozilla.

Однако в обоих случаях я не мог найти вескую причину, почему вы это сделаете.

Правила кодирования Google и Mozilla выглядят лучше всего для меня, потому что они принуждают вас включать в себя самые "стандартные" заголовки.

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

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

Я бы подумал, что лучше всего использовать соответствующий заголовок.

Ответ 1

Это необходимо, чтобы ваши клиенты не ненавидели вас, когда они включали ваш заголовок библиотеки.

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

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

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

Ответ 2

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