рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Директивы препроцессора.

Директивы препроцессора. - раздел Философия, Лекция 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.

 

 

– Конец работы –

Эта тема принадлежит разделу:

Лекция 1. Объектно-ориентированное программирование – это новый подход к программированию. Объектно- ориентированные языки обладают свойством

ВВЕДЕНИЕ... Приступая к изучению более сложных конструкций языка С следует прежде всего повторить тот материал который был...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Директивы препроцессора.

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Имя_объекта.имя_элемента
x1.real=dim[3].real=1.45;   Класс может иметь столько объектов сколько необходимо, так же как и любая функция. Объекты могут быть любого тип

Имя объекта.имя функции();
Пример: #include<iostream.h> class rec { private: double len; double wid; public: double Len(){ return len/100;}

Наследование.
  В объектно- ориентированном программировании на основе уже существующих классов можно строить производные классы. Наследование означает, что производный класс, который называется кл

Включение файлов.
  Директива #include включает в текст программы содержимое указанного файла. Эта директива имеет две формы:   #include "имя файла&

Условная компиляция.
  Условные конструкции препроцессора позволяют компилировать или пропускать часть программы в зависимости от выполнения некоторого условия. Условие может принимать одну из описываемых

ВНУТРЕННЕЕ ПРЕДСТАВЛЕНИЕ ЦЕЛЫХ ТИПОВ ДАННЫХ.
  Беззнаковые данные хранятся в оперативной памяти просто, чтобы узнать какое число хранится в данном байте или в слове необходимо выписать значения всех его битов и считать, что это

Доступ к отдельному биту.
  Одним из методов, позволяющих доступ к биту - это использование полей битов. Поля битов – это специальный тип членов структуры, в котором определено из скольких бит состоит каждый э

Аргументы функции main()
  Функция main, с которой начинается выполнение программы на языке СИ, может быть определена с параметрами, которые передаются из внешнего окружения, например, из командной строки. Во

Область действия и область видимости переменных.
  В языке C++ каждая функция это отдельный блок программы. Попасть в тело функции можно только с помощью вызова данной функции, то есть нельзя оператором безусловного перехода goto пе

Модификаторы переменных.
  В языке C++ имеется несколько модификаторов которые изменяют область действия и время жизни переменных     Модификаторы &nb

Модификатор тип_переменной имя_переменной
Все переменные в программе характеризуются не только типом, но и классом памяти. В языке Си существует четыре класса памяти: автоматический (automatic), регистровый(registe

Время жизни переменных.
  Если программист не указал иного, то объект создается, когда встречается его описание, и уничтожается, когда его имя выходит из области видимости, Объекты с глобальными именами созд

ПЕРЕГРУЖЕННЫЕ ФУНКЦИИ.
  Перегрузкой называют практику придания функции более чем одного значения. Этот термин означает, что в коде программы существует две различные по содержанию, но одинаковые по названи

ФУНКЦИИ С ПЕРЕМЕННЫМ ЧИСЛОМ ПАРАМЕТРОВ.
  При вызове функции с переменным числом параметров в вызове этой функции задается любое требуемое число аргументов. В объявлении и определении такой функции переменное число аргумент

УКАЗАТЕЛЬ НА ФУНКЦИЮ.
  Основными характеристиками функции является тип возвращаемого значения и список типов формальных параметров. Подобно тому, как имена переменных никаким образом не влияют на их тип,

Начальные установки графики.
  Перед началом работы с графикой, используется функция initgraph(), которая инициализирует графическую систему загружает графический драйвер и переводит систему в графический режим.

Функция line().
  Функция line() - вычерчивает линию между двумя заданными точками принадлежит библиотеке graphics.h Общий вид вызова: void line(int x1, int y1, int x2, int

Функция lineto().
  Функция lineto() чертит линию от текущей позиции курсора в точку с координатами (x,y)Расположена в библиотеке graphics.h Общий вид вызова функции: void li

Функция circle().
  Функция circle() вычерчивает окружность заданного радиуса из заданного центра. Функция находится в графической библиотеке graphics.h В качестве параметров передаются коорди

Функция rectangle ()
  Назначение функции rectangle () в вычерчивании прямоугольника. Функция rectangle () вычерчивает прямоугольник, используя при этом текущие тип линии, толщину и цвет

ФОРМАТИРОВАННЫЙ ПОТОКОВЫЙ ВВОД-ВЫВОД.
  В примерах программ рассмотренных выше, использовались операции помещения в поток << , например в стандартный поток вывода cout и операцией извлечения из потока >>, прим

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги