Когда поместить функцию C++ в заголовочный файл

Я смотрел на Повышение и различные другие библиотеки C++. Подавляющее большинство Повышения реализовано в заголовочных файлах.

Мой вопрос: при каких условиях Вы делаете реализацию только для заголовка (как Повышение) или также включаете .cpp файл?

7
задан Jonathan Leffler 20 March 2010 в 21:22
поделиться

2 ответа

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

То же самое применимо, если вы хотите использовать встроенную функцию из другой единицы перевода.

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

7
ответ дан 7 December 2019 в 01:19
поделиться

Понимание этой проблемы в основном связано с пониманием того, как работают модули компиляции C ++. Вещи в файлах заголовков в основном вставляются в исходный код целой группы модулей компиляции с помощью операторов #include .Каждая единица компиляции компилируется в объектный файл, объектные файлы связываются, и возникают конфликты из-за того, что этот материал реплицируется повсюду.

Исключениями являются вещи, которые (по крайней мере исторически) не попадают в объектный файл, потому что компилятор имеет дело с ними напрямую (например, встроенные функции), а также вещи, которые не могут быть скомпилированы в одном модуле, а затем связаны с другим. потому что они не полностью определены (шаблоны). Шаблонные функции часто идентично создаются в нескольких единицах компиляции, и у компоновщика есть специальные возможности для удаления дубликатов.

Это означает, что разделение интерфейса и реализации на файлы заголовков и тела не так чисто. В Ada гораздо более четкое разделение, но более сложный процесс сборки, чтобы компенсировать IIRC. Java просто удалила отдельные файлы для интерфейса и реализации.

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

3
ответ дан 7 December 2019 в 01:19
поделиться