Препроцессор и модификаторы типов данных в Турбо-С


Препроцессор

В языке С предусмотрены простые средства расширения языка на основе макропроцессора (символьного препроцессора).

Макроподстановка

Команда (строка) имеющая вид

# 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; просмотров: 1380;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.007 сек.