Я нашел несколько мест, где обсуждается, лучше ли устанавливать определения в заголовках или нет (например, here). Тем не менее, я не мог найти что-то вроде «руководства для кода только для заголовка». Ответ на вопрос, связанный упоминает некоторые недостатки:Что я должен учитывать при размещении всего кода в заголовке?
- увеличил время компиляции
- не возможно иметь циклические зависимости
- нет (простых) глобальных объектов
Но это все?
Каковы последствия ввода (всего) кода в заголовке?
Сохраняется ли я, если я использую защитники заголовка, или есть другие подводные камни?
Причина, по которой я спрашиваю, это следующее: Я в ситуации, когда, по-моему, проще всего поместить весь код в мои файлы заголовков. Это (довольно небольшая) коллекция классов и функций, которая должна быть включена другими в их код. Предполагается, что он используется в разных средах и в разных рамках. На данный момент я не понимаю, почему я должен создать свой код (в lib), когда тот, кто его использует, может просто включить заголовок, который ему нужен, и скомпилировать его. Однако, независимо от этого проекта, я всегда испытываю «плохое чувство» при размещении кода в заголовках, даже если ни один из 3 пунктов, о которых я говорил выше, не имеет значения. Было бы очень приятно, если бы кто-то мог пролить свет на это для меня, поэтому я могу принять решение о том, где поставить код на более разумной основе.
Я абсолютно не согласен с кодом раздувания! Мой опыт заключается в том, что инкрустация идет вперед с постоянными расчетами и распространением, что в основном приводит к «оптимизированным прочим» параметрам и функциям. С C++ 11 и constexpr этот эффект намного выше, чем удвоение исполняемого кода в строках. – Klaus
@Klaus Действительно интересно! Я думаю, что, в зависимости от нескольких факторов, таких как «длина» функции и других, можно иметь разные типы поведения. Как вы думаете? –
Можете ли вы подробнее рассказать о встроенных? Я всегда немного смущен о «inline = функции, определенной в заголовке» и «inline = function с ключевым словом inline» (что верно только в том случае, если функция определена в заголовке, верно?) – user463035818