78 __ __ _______________Часть II. Программирование на C++

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

Применения препроцессора

История гласит, что язык С был создан потому, что его авторам Бриану Керниган (Brian Kemighan) и Дэннису Ритчи (Dennis Ritchie) надоело писать программы на ассемблере. История умалчивает о том, что они отнюдь не презирали ассемблер как таковой. Наверняка они отдавали должное возможности программировать на самой грани между программными и аппаратными средствами; но есть основания подозревать, что кому-то из них больше по душе были макросы (macros).

Если вы когда-нибудь программировали на ассемблере, то наверняка заме-гите, что макроопределение типа

MACRO Trap

int 3h ; Отладочное прерывание END

подозрительно смахивает на

ffdefine TrapO { asm int 0х03 }

В обоих случаях происходит одно и то же: когда встречается слово Trap, оно вменяется на соответствующий фрагмент кода, int 3h в ассемблере, { asm.

Lnt 0х03 } В С.

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

Программисты на С использовали (и некоторые до сих пор еще продолжают >то делать) директивы препроцессора для объявления символических кон-;тант:

'define MAX 10 /* символическая константа 'define NULL (void*)0 /* еще одна '

Помимо этого, как уже упоминалось, препроцессор использовался и ис-юльзуется для записи макросов (макроопределений), есть у него еще ряд •бязанностей. Например, директива #include в С и C++ служит для вклю-[ения файлов заголовков (они обычно имеют расширение .h или .hpp).