Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Препроцессор, оформление программы и средства ввода-вывода

Языки программирования обеспечивают плодородную почву для спорных идей.

Н.Вирт

 

В программах написанных на Си вы часто встречаете директивы препроцессора или, другими словами, символьного макропроцессора. Все эти директивы записываются с новой строки текста и начинаются с символа '#'.

Типичным примером подобной директивы является строка

 

#include <параметры>

 

или

 

#include “параметры”

 

Оба вида означают необходимость подстановки в это место текста файла, определяемого параметрами директивы. В случае использования «угловых» скобок: <параметры> файл ищется в директории библиотеки компилятора, а в случае кавычек — в текущей директории.

Как правило подставляемые таким образом файлы в свою очередь содержат дополнительные директивы, определяющие правила генерации подставляемого текста.

Самой простой директивой можно считать строку

 

#define < левая часть > < правая часть >

 

Где < левая часть > и < правая часть > не что иное как строки символов, разделённые пробелами. Левая часть определяет имя или прототип макроподстановки, а правая — соответствующие подставляемые значения. Например:

 

#define TRUE (1)

#define FALSE (0)

#define NULL (0)

 

#define FOREVER while(1)

 

После подобных макроопределений препроцессор Си везде, где встретит указанные имена, будет заменять их на соответствующие значения. При подстановке могут использоваться параметры прототипа макроопределения. Используя такую директиву можно определить полезные операции над отдельными битами и группами бит (параметры в правой части заключены в круглые скобки):

 

/* Manipulation of single bits: */

/* (b) is the number of the bit to be manipulated (0..?, rvalue) */

/* (w) is the integer value who's bits are to be altered (LVALUE) */

/* (v) is the integer value who's bits are to be tested (rvalue) */

#define BITSET(b, w) ((w) |= (1 << (b))) /* VOID type */

#define BITCLR(b, w) ((w) &= ~(1 << (b))) /* VOID type */

#define ISBITSET(b, v) ((v) & (1 << (b))) /* BOOL type */

#define ISBITCLR(b, v) (~(v) & (1 << (b))) /* BOOL type */

#define GETBITS(b, n, v) (((v) >> (b)) & ((1 << (n)) - 1))

#define PUTBITS(b, n, v, x) ((((x) & ((1 << (n)) - 1)) << (b)) \

| ((v) & ~(((1 << (n)) - 1) << (b))))

 

Используя директивы #if (#ifdef, #ifndef), #else, #endif можно гибко управлять подстановкой текста, включая или исключая из него требуемые фрагменты. При этом директивы #define и #undef позволяют управлять предысторией процесса, устанавливая или сбрасывая установки объектов макроподстановки.

Препроцессор активно используется в проектировании модулей программной системы. Так для большинства пользователей модуля не представляет интереса способ реализации экспортируемых им функций, но для работы с ним необходимо иметь прототипы вызовов и определения собственных типов (структур) этого модуля.

 




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


Дата добавления: 2014-12-26; Просмотров: 375; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.