Шаг 74.
Назначение препроцессора

    На этом шаге мы рассмотрим для чего используется препроцессор.

    Препроцессор - это программа, которая производит некоторые (иногда весьма значительные) манипуляции с первоначальным текстом программы перед тем, как он подвергается компиляции. Будучи дословно переведенным с английского, слово препроцессор означает предварительный обрабатыватель.

    Препроцессоры создают входной текст для компиляторов и могут выполнять следующие функции:

    Например, весьма часто в программах приходится использовать "ничего не говорящие" числа. Это могут быть какие-то математические константы или размеры используемых в программе массивов и т.д. Общепризнано, что обилие таких констант затрудняет понимание программ и считается признаком плохого стиля программирования. В среде программистов такие константы получили язвительное название магических чисел. Чтобы программа не изобиловала ими, "хорошие" языки программирования, такие, как Pascal, Modula-2, Ada и другие, позволяют дать константе имя и далее использовать его везде вместо самой константы.

    В языке C++ такую возможность обеспечивает препроцессор. Например, с помощью определений

   #define P1 3.14159
   #define E  2.71284

препроцессор заменит в программе все имена P1 и E на соответствующие числовые константы. Теперь, когда вы обнаружите, что неправильно написали приближенное значение основания натуральных логарифмов, вам достаточно исправить единственную строку с определением константы, а не просматривать всю программу:

   #define E 2.71828

    Препроцессор языка C++ позволяет переопределять не только константы, но и целиком программные конструкции. Например, можно написать определение:

   #define forever for(;;)
и затем всюду писать бесконечные циклы в виде:
   forever { <тело цикла> }
А если вам не нравятся фигурные скобки, то определите
   #define begin {
   #define end }

и далее используйте в качестве операторных скобок begin и end, как это делается, например, в языке Pascal. Подобные определения, называемые макроопределениями (макросами), могут иметь параметры (и вследствие этого быть еще более мощными).

    Еще одна важная важная "услуга" препроцессора - включение в исходный текст содержимого других файлов. Эта возможность в основном используется для того, чтобы снабжать программы какими-то общими для всех файлов определениями. Например, чрезвычайно часто в начале программы на языке C++ встречается препроцессорная конструкция:

   #include <iostream.h>

    Когда исходный текст программы обрабатывается препроцессором, на место этой инструкции ставится содержимое файла iostream.h, содержащего макроопределения и объявления данных, необходимых для работы потоков ввода-вывода.

    Оператор (директива) препроцессора - это одна строка исходного текста, начинающаяся с символа #, за которым следуют название оператора (define, pragma, include, if) и операнды. Операторы препроцессора могут появляться в любом месте программы и их действие распространяется на весь исходный файл.

    На следующем шаге мы рассмотрим вопросы определения констант.


Предыдущий шаг Содержание Следующий шаг