23. Делайте заголовочные файлы самодостаточными
23. Делайте заголовочные файлы самодостаточными
Резюме
Убедитесь, что каждый написанный вами заголовочный файл компилируем самостоятельно, т.е. что он включает все заголовочные файлы, от которых зависит его содержимое.
Обсуждение
Если один заголовочный файл не работает, пока не включен другой заголовочный файл, проект получается очень неуклюжим, а на пользователя возлагается дополнительная задача следить за тем, какие заголовочные файлы надо включить в исходный текст.
Раньше некоторые эксперты советовали, чтобы заголовочные файлы не включали другие заголовочные файлы из-за накладных расходов на многократное открытие и анализ заголовочных файлов, защищенных директивами препроцессоров от повторной обработки. К счастью, сейчас этот совет устарел. Многие современные компиляторы С++ распознают соответствующую защиту заголовочных файлов автоматически (см. рекомендацию 24) и просто не открывают один и тот же заголовочный файл дважды. Некоторые компиляторы используют предкомпиляцию заголовочных файлов, которая позволяет избежать анализа часто используемых заголовочных файлов.
Однако не включайте заголовочные файлы, в которых вы не нуждаетесь, так как это напрасно создает паразитные зависимости.
Для гарантии самодостаточности заголовочных файлов скомпилируйте каждый из них отдельно от других и убедитесь, что это не приводит к ошибкам или предупреждениям.
Примеры
Ряд тонких моментов возникает в связи с использованием шаблонов.
Пример 1. Зависимые имена. Шаблоны компилируются в точке, где они определены, с тем исключением, что все зависимые имена или типы не компилируются до точки инстанцирования. Это означает, что template<class T> class Widget с членом std::deque<T> не приведет к ошибке времени компиляции, даже если заголовочный файл <deque> не включен — если при этом не происходит инстанцирование Widget. Поскольку очевидно, что шаблон Widget существует для того, чтобы быть инстанцированным, его заголовочный файл должен содержать строку #include <deque>.
Пример 2. Шаблоны функций-членов и функции-члены шаблонов инстанцируются только при использовании. Предположим, что Widget не имеет члена типа std::deque<T>, но функция-член Widget с именем Transmogrify использует deque. Тогда вызывающая Widget функция может инстанцировать и использовать Widget, даже если заголовочный файл <deque> не включен — до тех пор, пока не используется функция-член Transmogrify. По умолчанию заголовочный файл Widget все же должен включать <deque>, поскольку это необходимо, по крайней мере, для некоторых пользователей Widget. В редких случаях, когда большой заголовочный файл включается только для обеспечения работоспособности нескольких редко используемых функций шаблона, следует подумать о том, чтобы сделать эти функции не членами и вынести их в отдельный заголовочный файл, включающий упомянутый большой файл (см. рекомендацию 44).
Ссылки
[Lakos96] §3.2 • [Stroustrup00] §9.2.3 • [Sutter00] §26-30 • [Vandevoorde03] §9-10
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
5.2. Заголовочные файлы
5.2. Заголовочные файлы Время от времени вы можете застать себя на том, что просматриваете заголовочные файлы Linux. Скорее всего, вы найдете рад конструкций, не совместимых со стандартом ANSI/ISO. Некоторые из них стоят того, чтобы в них разобраться. Все конструкции,
Приложение A Заголовочные файлы
Приложение A Заголовочные файлы В этом приложении показаны все локальные заголовочные файлы для исходного кода, рассмотренного в книге.1: /* libhello.h */2:3: #ifndef LIBHELLO_H_4: #define LIBHELLO_H_5:6: void print_hello(void);7:8: #endif /* LIBHELLO_H_ */1: /* ptypair.h */2:3: #ifndef _PTYPAIR_H4: #define _PTYPAIR_H5: int get_master_pty(char **name);6: int get_slave_pty(char
Принцип 7: Делайте упор на конверсию
Принцип 7: Делайте упор на конверсию Давайте совершим небольшое путешествие во времени. в март 2000 года. В журнале Fortune появляется статья, в которой Билл Керли, один из ведущих интернет-аналитиков, сколотивший состояние на вложениях в венчурный бизнес, пишет, что
INF-файлы
INF-файлы В данной статье мы рассмотрим, что представляет собой INF-файл, как с его помощью работать с другими файлами и реестром, создавать ярлыки, запускать программы и т.д.Как известно, для более-менее серьезного программного продукта обычно требуется специальная
§ 57. Делайте сайты проще
§ 57. Делайте сайты проще Простота — необходимое условие прекрасного. Л. Н. Толстой. Из письма к Л. Андрееву от 02.09.1902 2 августа 2000Почти сто лет прошло с момента написания эпиграфа к этому параграфу, а ценность высказывания не уменьшилась.Желание усложнить всегда
Стойкое дежавю: не делайте регистрацию обязательной
Стойкое дежавю: не делайте регистрацию обязательной 30 % посетителей интернет-магазинов уходят с сайта лишь потому, что им нужно было зарегистрироваться, чтобы совершить покупку. Пользователи не любят регистрацию, так как у них уже есть уйма разных аккаунтов и им не
41. Делайте данные-члены закрытыми (кроме случая агрегатов в стиле структур С)
41. Делайте данные-члены закрытыми (кроме случая агрегатов в стиле структур С) РезюмеДанные-члены должны быть закрыты. Только в случае простейших типов в стиле структур языка С, объединяющих в единое целое набор значений, не претендующих на инкапсуляцию и не
50. Делайте деструкторы базовых классов открытыми и виртуальными либо защищенными и невиртуальными
50. Делайте деструкторы базовых классов открытыми и виртуальными либо защищенными и невиртуальными РезюмеУдалять или не удалять — вот в чем вопрос! Если следует обеспечить возможность удаления посредством указателя на базовый класс, то деструктор базового класса
87. Делайте предикаты чистыми функциями
87. Делайте предикаты чистыми функциями РезюмеПредикат представляет собой функциональный объект, который возвращает ответ да/нет, обычно в виде значения типа bool. Функция является "чистой" в математическом смысле, если ее результат зависит только от ее аргументов
Исходные файлы и выполняемые файлы
Исходные файлы и выполняемые файлы Наша замечательная программа, несмотря на свою лаконичность и простоту, для компьютера является совершенно бессмысленным набором символов, так как он "не понимает" директив типа #include или printf. Он понимает только специальный язык,
Делайте меньше
Делайте меньше Меньше соревнуйтесь Народная мудрость гласит: чтобы подавить своих конкурентов, вы должны переиграть их. Если у них четыре возможности, у вас их должно быть пять, пятнадцать, двадцать… Если они тратят N, то вы должны потратить NN. Если у них есть 20, то у вас
Фиксируйте время и бюджет, делайте возможности гибче
Фиксируйте время и бюджет, делайте возможности гибче Запускайте вовремя и согласно сметеЛёгкий способ начать вовремя и уложиться в бюджет: фиксируйте время и бюджет. Никогда не отдавайте больше времени или денег проблеме, умерьте пыл.Бытует миф: мы можем начать вовремя,
Делайте идейное программное обеспечение
Делайте идейное программное обеспечение Ваше приложение должно лавировать между потребностямиНекоторые люди считают, что программное обеспечение должно быть агностическим. Они говорят, что самоуверенно для разработчиков ограничивать особенности или пренебрегать
4.3 Заголовочные Файлы
4.3 Заголовочные Файлы Типы во всех описаниях одного и того же объекта должны быть согласованными. Один из способов это достичь мог бы сотоять в обеспечении средств проверки типов в компоновщике, но большинство компоновщиков – образца 1950-х, и их нельзя измнить по
Повышайте качество - делайте меньше за спринт!
Повышайте качество - делайте меньше за спринт! Это решается ещё на планировании спринта. Проще говоря, не пытайтесь сделать как можно больше историй за спринт. Если у вас существуют проблемы с качеством или вам приходится тратить слишком много времени на приёмочное