Страницы

Поиск по вопросам

вторник, 30 октября 2018 г.

Чем плохо писать C++ код в .hpp файлах

Встречал и сам писал библиотеки одного .hpp файла. Удобно, что не нужно повторять код. Чем это может быть плохо? Вот пример довольно популярной и удачной библиотеки.


Ответ

Плохо в этом то, что вы теряете преимущества раздельной компиляции.
Во-первых, это время. Ваша функция будет компилироваться каждый раз, когда cpp-файл включает этот header. Хуже того, теперь при каждом изменении подробностей реализации придётся перекомпилировать не один cpp-файл с имплементацией, а все, которые включают ваш header.
Во-вторых, это увеличивающееся количество зависимостей. Если вам для декларации функции не нужны другие header'ы, а для имплементации нужны, то теперь вы вынуждены включать всё в header, и значит, все, кто его используют ваш header, тоже будут «видеть» эти другие header'ы.
К этому непосредственно примыкает и проблема номер 3: кольцевые зависимости. Допустим, у вас есть две функции в разных файлах, которые вызывают друг друга. Если в header'ах только декларации функций, то cpp-файлах можно подключить недостающий header, и функции могут легко ссылаться друг на друга. В случае, когда имплементация в header'е, такое не пройдёт из-за взаимной рекурсии включений, и вам придётся идти на уродливые трюки наподобие «точно знать, какие функции нужны другому header'у, и предварительно объявить их перед включением».
И наконец, вы теряете инкапсуляцию: любой может видеть вашу имплементацию, и это провоцирует кодировать используя знание о том, как же там всё реально устроено (что по очевидным причинам плохо).

Заметьте, что если ваша функция — шаблонная, то вам скорее всего таки придётся объявлять её полностью в header'е, и столкнуться со всеми вышеперечисленными проблемами.

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

Отправить комментарий