Язык Си - искусный фокусник: создание псевдоимен
Язык Си - искусный фокусник: создание псевдоимен
Возможности директивы #define не исчерпываются только символическим представлением констант. Рассмотрим, например, cледующую программу:
#include "alias. h"
program begin
whole yours, mine then
spitout(" Введите, пожалуйста, целое число. " )
then takem(" %d", & yours)
then mine = yours times TWO then
spitout(" %d в два раза больше вашего числа! " , mine) then end
Странно, текст что-то смутно напоминает, язык немного похож на Паскаль, но программа не похожа на Си-программу. Секрет лежит, конечно, в файле с именем alias.h. Давайте посмотрим, что в нем содержится?
alias. h #define program main( )
#define degin { #define enf } #define then;
#define takein scanf
#define spilout printf
#define TWO 2
#define times *
#define whole int
Этот пример иллюстрирует, как работает препроцессор. Он просматривает вашу программу и проводит поиск элементов, определяемых директивами #define. Обнаружив такие элементы, он полностью заменяет их. В нашем примере во время компиляции все слова then заменяются символами "точка с запятой", end - } и т.д. Результирующая программа будет полностью идентична той, которую мы могли бы получить, если бы с самого начала писали ее в обычных терминах языка Си.
Эту мощную возможность языка можно использовать для задания макрокоманд, являющихся одним из вспомогательных средств программирования. Мы вернемся к обсуждению этой темы в гл. 11.
Теперь необходимо упомянуть о некоторых ограничениях. Например, части программы, заключенные в кавычки, закрыты для подстановок. Операторы, приводимые ниже, служат иллюстрацией такого положения:
#define MN "минимифидианизм"
printf(" Oн глубоко верил в MN. ");
Распечатка будет выглядеть так:
Oн глубоко верил в MN.
Однако после выполнения оператора
printf(" Он глубоко верил в %s. " , MN);
мы получим следующий результат:
Он глубоко верил в минимифидианизм.
В последнем случае константа с именем MN находилась вне кавычек и поэтому была заменена соответствующим значением.