Препроцессор и модификаторы типов данных в Турбо-С
Препроцессор
В языке С предусмотрены простые средства расширения языка на основе макропроцессора (символьного препроцессора).
Макроподстановка
Команда (строка) имеющая вид
# define идентификатор подстановка
заставляет препроцессор заменять последующие вхождения идентификатора на указанную строку лексем. Если команда имеет вид
define идентификатор (идентификатор, ... , идентификатор) подстановка,
причем между первым идентификатором и открывающей скобкой нет никакого пробела, то это определение макроподстановки с аргументами. После такого описания вхождение первого идентификатора с последующей скобкой «(« , лексемами, разделенными запятыми, и скобкой «)» заменяется на строку-подстановку из определения. Причем каждое вхождение идентификатора, упомянутого среди формальных параметров определения, заменяется на соответствующую лексему-строку из обращения. Фактические аргументы обращения суть лексемы-строки, отделенные одна от другой запятой. Однако, запятая, встретившаяся в кавычках или «защищенная скобками, уже не считается разделителем для аргументов. Число формальных и фактических параметров должно быть одинаковым. На тексты внутри строк или символьные константы механизмы подстановок не распространяются.
Какого бы вида подстановка ни произошла, результирующая строка вновь просматривается и в ней ищутся определенные идентификаторы. При описании и той и другой подстановки могут встречаться «длинные» определения, продолжающиеся в следующей строке, для этого в конце строки, у которой есть продолжение, ставится символ «\». Область действия» определяемых в «# define» имен простирается от точки определения до конца исходного файла. Имена могут переопределяться, и определения могут использовать предыдущие определения. Внутри строк, заключенных в кавычки, подстановка не происходиr., так что, например, если УЕS-определенное имя, то в printf (IfYESIf) подстановки не будет.
Пример
#define YES 1
…………………………..
printf(“YES”);
Замена YES на 1 выполняться не будет.
Определения такого типа очень хорошо подходят для введения констант-параметров реализации, например, в таких комбинациях:
#define TAВSIZE 100
int table[TAВSIZE);
Команда вида
#undef идентификатор
приводит к тому, что препроцессор начинает считать указанный идентификатор неопределенным, т. е. не подлежащим замене.
Пример
#define mах(А, В) ((А) > (В) ? (А) : (В))
После этого строка
х = max(p+q, r+s);
будет заменена на строку x = ((p+q) > (r+s) ? (p+q) : (r+s));
Это позволяет ввести функцию max(), которая вставляется прямо в программу, без обращения к подпрограмме. Поскольку аргумент трактуется буквально, такое макроопределение работает для любых типов данных и нет необходимости в различных видах mах() для данных различных типов, как это пришлось бы делать для функций.
Конечно, если посмотреть на полученное выше расширение для mах(), то можно увидеть некоторые промахи. Дважды вычисляются выражения, - это плохо, если они содержат побочные эффекты, вроде обращения к функциям или операции автоувеличения. Надо тщательно расставлять скобки, чтобы быть уверенными в надлежащем порядке вычислений.
Между именем и левой скобкой, вводящей список аргументов, не может быть никаких пробелов.
Включение файлов
Возможность включения файлов предусмотрена как средство для облегчения обработки групп «# define» и глобальных описаний. Любая строка текста, выглядящая как
#include "uмя файла"
заменяется содержимым файла с указанным именем. Кавычки здесь обязательны. Конструкции «# include» могут «вкладываться» одна в одну. Конструкция «#include» представляет собою наиболее приемлемый способ собрать вместе описания для больших программ. Этот способ гарантирует, что все исходные файлы будут снабжены одинаковыми определениями и описаниями переменных и тем самым будет исключен один из источников ошибок. Конечно, если включаемый файл будет изменен, то все зависящие от него файлы должны быть перетранслированы.
Имеется и другой вариант команды:
#include <имя файла>
Самостоятельно выяснить отличия выполнения команд!!!!!
I |
Команды включения могут оказаться «вставленными» одна в другую.
Дата добавления: 2016-05-26; просмотров: 1396;