Глава 4. Препроцессор____________________________________83_
По всей видимости, препроцессор не отомрет еще несколько долгих лет, поскольку пока не видно даже намеков, как можно заменить, например, директиву ftinciude. Язык C++ развивается и изменяется коллективными усилиями членов комитета по ANSI C++, в числе которых есть представители Bell Labs, Microsoft и Borland. Если вам посчастливилось прочитать Annotated Reference C++ Manual, известное также как ARM, то вы знаете, что Бьерн Страуструп — вдохновитель C++ и Председатель комитета ANSI C++ — придает большое значение постепенному переходу от старых средств к новым: только так можно избежать необходимости перерабатывать горы уже существующего материала. .
Все эти рассуждения преследуют единственную цель: сейчас мы переходим к рассмотрению современной роли препроцессора, в том числе некоторых весьма важных его функций, и у вас не должно остаться впечатления, будто речь идет о каком-то атавизме, который не сегодня-завтра отомрет. Препроцессору находятся все новые и новые применения; многие из которых, существуют в примитивных формах уже около двадцати лет, помогая писать более понятный и управляемый код.
Современная роль препроцессора в создании приложений
За препроцессором по-прежнему остались многие традиционные области применения: новые программы также используют директиву ftinciude для подстановки текста из заголовков; и вы, вероятно, неоднократно сталкивались с макроопределениями и объявлениями символических констант. В следующих разделах мы рассмотрим более интересные возможности препроцессора, некоторые дополнительные области его применения и узнаем, какие его функции уже переданы собственно языку.
Как ранее упоминалось, при компиляции программ препроцессору принадлежит первый шаг. В этом качестве препроцессор используется для включения текстовых файлов, содержащих некий набор кода, называемых заголовками или .h-файлами. Файлы заголовков обычно используются для задания интерфейсов (иначе — деклараций или объявлений) классов и функций.
C++ — язык жестко типизированный, что означает, что объявление классов, функций или данных должно предшествовать их первому использованию. Декларации определяют "правила", в соответствии с которыми приложение должно использовать каждый из этих элементов. Заголовки, будучи включаемыми файлами, удобны для размещения деклараций, поскольку они обычно включаются в самом начале исходных модулей, до появления любых определений. Это не догма и не требование языка, это просто соглашение, выработанное программистами методом проб и ошибок на протяжении многих лет практики.