Язык Си - искусный фокусник: создание псевдоимен

We use cookies. Read the Privacy and Cookie Policy

Язык Си - искусный фокусник: создание псевдоимен

     Возможности директивы #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 находилась вне кавычек и поэтому была заменена соответствующим значением.