На этом шаге мы рассмотрим для чего используется препроцессор.
Препроцессор - это программа, которая производит некоторые (иногда весьма значительные) манипуляции с первоначальным текстом программы перед тем, как он подвергается компиляции. Будучи дословно переведенным с английского, слово препроцессор означает предварительный обрабатыватель.
Препроцессоры создают входной текст для компиляторов и могут выполнять следующие функции:
Например, весьма часто в программах приходится использовать "ничего не говорящие" числа. Это могут быть какие-то математические константы или размеры используемых в программе массивов и т.д. Общепризнано, что обилие таких констант затрудняет понимание программ и считается признаком плохого стиля программирования. В среде программистов такие константы получили язвительное название магических чисел. Чтобы программа не изобиловала ими, "хорошие" языки программирования, такие, как 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) и операнды. Операторы препроцессора могут появляться в любом месте
программы и их действие распространяется на весь исходный файл.
На следующем шаге мы рассмотрим вопросы определения констант.