Реферат Курсовая Конспект
Директивы препроцессора. - раздел Философия, Лекция 1. Объектно-ориентированное программирование – это новый подход к программированию. Объектно- ориентированные языки обладают свойством Препроцессор(Макропроцессор) - Это Составная...
|
Препроцессор(макропроцессор) - это составная часть стандартного пакета языка Си, которая обрабатывает исходный текст программы до того, как он пройдет через компилятор. Препроцессор читает строки текста и выполняет действия, определяемые командными строками - директивами. Если первый отличный от пробела символ в строке- управляющий (#), то такая строка рассматривается препроцессором как командная. Строки, не являющиеся командными, либо подвергаются преобразованиям, либо остаются без изменения.
Существует целый ряд директив препроцессора и большинство из них предназначено для управления работой компилятора.
Наиболее важными из них являются директивы #define и #include.
Рассмотрим наиболее часто используемые возможности препроцессора: макрогенерация (замена лексических единиц) #define,
включение файлов #include, условная компиляция #if #ifdef.
2.3.2. Замена лексических единиц.
Замена одной группы символов на другую можно осуществить с помощью директивы #define.
Директива #define имеет две синтаксические формы:
#define идентификатор текст
#define идентификатор (список параметров) текст
Эта директива заменяет все последующие вхождения идентификатора на текст. Такой процесс называется макроподстановкой.
Пример:
#define WIDTH 80
#define LENGTH (WIDTH+10)
В данном примере эти директивы изменят в тексте программы каждое слово WIDTH на число 80, а каждое слово LENGTH на выражение (80+10) вместе с окружающими его скобками.
Командная строка вида #define name text вызывает в оставшейся части программы замену всех вхождений идентификатора nameна строку text.Например, определение #define pi 3.14159265позволяет использовать в программе имя piвместо константы 3.14159265.Такое определение не завершается точкой с запятой.
Замещающий текст обычно представляет собою остаток строки. Длинное определение можно продолжить, если в конце продолжаемой строки поставить . Внутри строк, заключенных в кавычки, подстановка не производится, так что, например, для определенного выше имени pi в функции printf("pi");подстановки не будет. Имена могут переопределяться и новые определения могут использовать ранее введенные определения.
Так как препроцессор не является частью компилятора языка Си, а представляет относительно простой макрогенератор, имеется возможность переопределять различные синтаксические единицы языка-лексемы (т.е. идентификаторы, ключевые слова, константы, цепочки литер, знаки операций и знаки пунктуации).
В приведенной ниже программе, предназначенной для выявления всех пар целых чисел из интервала [-n,n],являющихся решениями уравнения 2*yx*x =4 ,используются привычные для языка Паскаль, операторные скобки begin-endвместо пары {}, иключевое слово then. Это стало возможным благодаря предварительно определенным лексическим заменам.
Пример :
#include <stdio.h>
#define then //then будет заменено на пробел
#define begin { // begin заменяется на cкобку
#define end } // endзаменяется на скобку
main()
begin
int n,x,y,k=0;
printf("введи n
");scanf("%d",&n);
for(x=-n;x<=n;x++)
for(y=-n;y<=n;y++)
if(2*y-x*x==4) then
begin
k=k+1;
printf(x=%d, y=%d
",x,y);
end
if(k==0) then
printf("корней нет
");
end
Лекция 3.
Приведенная выше технология замены одной группы символов на другую относится к макросредствамязыка. Строка #define name textназывается макроопределением, nameназывается макрошаблоном, а text- макрорасширением. Каждое появление имени nameв теле программы называется макровызовом.
Командная строка
#define name (p1,p2, ..,pk) text
является макроопределением с аргументами. За именем nameв круглых скобках (после nameне должно быть пробела!) следует разделенные запятыми формальные параметры p1, p2 .., pk,также являющиеся идентификаторами. Каждый раз, когда в тексте программы встречается имя макроопределения с фактическими аргументами, они подставляются вместо формальных, так что заменяющий текст будет зависеть от вида макровызова. Определим в качестве примера такую макроподстановку:
#define MAX(X,Y) ((X)>(Y)?(X):(Y))
Использована условная операция для определения максимального из двух чисел.
Как и в определении функции, переменные Xи Yв макроопределении являются формальными параметрами.
После этого строка в программе:
m=MAX(a+b, a-b);
будет заменена на строку :
m=((a+b)>(a-b)?(a+b):(a-b));
Текст макроопределения берут в скобки для обеспечения большей надежности программы. Пренебрежение скобками может привести к серьезным ошибкам, что иллюстрируют два следующих примера.
Пусть нужно разделить число 16 на квадрат числа 2
В первом примере, где использованы скобки результат будет правильным.
Пример 1:
#include <stdio.h>
#define SQR(n) (n*n)
main()
{
printf("%d
",16/SQR(2));
}
Пример 2:
#include <stdio.h>
#define SQR(n) n*n
main()
{
printf("%d
",16/SQR(2));
}
Во втором примере, где скобки в макроопределении опущены, результат ошибочный, так как макроподстановка переопределится в текст:
printf("%d ",16/2*2);
что конечно, не равносильно задуманному.
Так, при наличии скобок #define MAX(X,Y) ( (X)>(Y)?(X):(Y) )
фрагмент t=MAX(i&j,s[i] || j);
будет заменен на фрагмент:
t=((i&j)>(s[i] || j)?(i&j):(s[i] || j);
а при отсутствии скобок – #define MAX(X,Y) X > Y ? X : Y
на фрагмент:
t=i&j>s[i] || j ? i&j : s[i] || j;
в котором условное выражение вычисляется совсем в другом порядке.
Макроопределения иногда используются вместо определений функций, обычно из соображений эффективности. Но следует помнить, что препроцессор может лишь заменять одну строку на другую, не разбираясь, зачем это нужно. В отличие от параметра функции, параметр макроопределения вычисляется при каждом вхождении в макроопределение. Поэтому макровызов MAX(i++, j++) для приведенного выше макроопределения к увеличению iи jна 2.
– Конец работы –
Эта тема принадлежит разделу:
ВВЕДЕНИЕ... Приступая к изучению более сложных конструкций языка С следует прежде всего повторить тот материал который был...
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Директивы препроцессора.
Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов