Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Макроподстановка
Определение вида
#DEFINE TES 1
приводит к макроподстановке самого простого вида - замене имени на строку символов. Имена в #DEFINE имеют ту же самую форму, что и идентификаторы в "с"; заменяющий текст совер- шенно произволен. Нормально заменяющим текстом является ос- тальная часть строки; длинное определение можно продолжить, поместив \ в конец продолжаемой строки. "Область действия" имени, определенного в #DEFINE, простирается от точки опре- деления до конца исходного файла. имена могут быть переопре- делены, и определения могут использовать определения, сде- ланные ранее. Внутри заключенных в кавычки строк подстановки не производятся, так что если, например, YES - определенное имя, то в PRINTF("YES") не будет сделано никакой подстанов- ки. Так как реализация #DEFINE является частью работы маKропредпроцессора, а не собственно компилятора, имеется очень мало грамматических ограничений на то, что может быть определено. Так, например, любители алгола могут объявить
#DEFINE THEN #DEFINE BEGIN { #DEFINE END;}
и затем написать
IF (I > 0) THEN BEGIN A = 1; B = 2 END
Имеется также возможность определения макроса с аргумен- тами, так что заменяющий текст будет зависеть от вида обра- щения к макросу. Определим, например, макрос с именем MAX следующим образом:
#DEFINE MAX(A, B) ((A) > (B)? (A): (B))
когда строка
X = MAX(P+Q, R+S);
будет заменена строкой
X = ((P+Q) > (R+S)? (P+Q): (R+S));
Такая возможность обеспечивает "функцию максимума", которая расширяется в последовательный код, а не в обращение к функ- ции. При правильном обращении с аргументами такой макрос бу- дет работать с любыми типами данных; здесь нет необходимости в различных видах MAX для данных разных типов, как это было бы с функциями.
Конечно, если вы тщательно рассмотрите приведенное выше расширение MAX, вы заметите определенные недостатки. Выраже- ния вычисляются дважды; это плохо, если они влекут за собой побочные эффекты, вызванные, например, обращениями к функци- ям или использованием операций увеличения. Нужно позаботить- ся о правильном использовании круглых скобок, чтобы гаранти- ровать сохранение требуемого порядка вычислений. (Рассмотри- те макрос
#DEFINE SQUARE(X) X * X
при обращении к ней, как SQUARE(Z+1)). Здесь возникают даже некоторые чисто лексические проблемы: между именем макро и левой круглой скобкой, открывающей список ее аргументов, не должно быть никаких пробелов. Тем не менее аппарат макросов является весьма ценным. Один практический пример дает описываемая в главе 7 стандар- тная библиотека ввода-вывода, в которой GETCHAR и PUTCHAR определены как макросы (очевидно PUTCHAR должна иметь аргу- мент), что позволяет избежать затрат на обращение к функции при обработке каждого символа. Другие возможности макропроцессора описаны в приложении А.
Date: 2015-09-17; view: 392; Нарушение авторских прав |