Макросы в C они очень важны, но в C++ применяются гораздо меньше. Первое правило относительно них такое: не используйте их, если вы не обязаны это делать. Как было замечено, почти каждый макрос проявляет свой изъян или в языке, или в программе. Если вы хотите использовать макросы, прочитайте, пожалуйста, вначале очень внимательно руководство по вашей реализации C препроцессора.
Простой макрос определяется так:
#define name rest of line
Когда name встречается как лексема, оно заменяется на rest of line.
Например:
named = name
после расширения даст:
named = rest of line
Можно также определить макрос с параметрами.
Например:
#define mac(a,b) argument1: a argument2: b
При использовании mac должно даваться две строки параметра. После расширения mac() они заменяют a и b.
Например:
expanded = mac(foo bar, yuk yuk)
после расширения даст
expanded = argument1: foo bar argument2: yuk yuk
Макросы обрабатывают строки и о синтаксисе C++ знают очень мало, а о типах C++ или областях видимости - ничего. Компилятор видит только расширенную форму макроса, поэтому ошибка в макросе диагностируется когда макрос расширен, а не когда он определен. В результате этого возникают непонятные сообщения об ошибках.
Вот такими макросы могут быть вполне:
#define Case break;case
#define nl <<"n"
#define forever for(;;)
#define MIN(a,b) (((a)<(b))?(a):(b))
Вот совершенно ненужные макросы:
#define PI 3.141593
#define BEGIN {
#define END }
А вот примеры опасных макросов:
#define SQUARE(a) a*a
#define INCR_xx (xx)++
#define DISP = 4
Чтобы увидеть, чем они опасны, попробуйте провести расширения в следующем примере:
int xx = 0; // глобальный счетчик
void f() {
int xx = 0; // локальная переменная
xx = SQUARE(xx+2); // xx = xx+2*xx+2
INCR_xx; // увеличивает локальный xx
if (a-DISP==b) { // a-= 4==b
// ...
}
}
Если вы вынуждены использовать макрос, при ссылке на глобальные имена используйте операцию разрешения области видимости :: и заключайте вхождения имени параметра макроса в скобки везде, где это возможно (см. MIN выше).
Обратите внимание на различие результатов расширения этих двух макросов:
#define m1(a) something(a) // глубокомысленный комментарий
#define m2(a) something(a) /* глубокомысленный комментарий */
например,
int a = m1(1)+2;
int b = m2(1)+2;
pасширяется в
int a = something(1) // глубокомысленный комментарий+2;
int b = something(1) /* глубокомысленный комментарий */+2;
С помощью макросов вы можете разработать свой собственный язык. Скорее всего, для всех остальных он будет непостижим. Кроме того, C препроцессор - очень простой макропроцессор. Когда вы попытаетесь сделать что-либо нетривиальное, вы, вероятно, обнаружите, что сделать это либо невозможно, либо чрезвычайно труд
Похожие работы
... ,5 1003. Если первая ячейка среди выделенных не содержит число, то заполнение числами не произойдет и ячейки останутся без изменения. Пример 11. Макрос “Диаграмма” Этот макрос будет восстанавливать стандартную диаграмму Excel. Если вы строили графики с использованием пользовательского автоформата диаграмм, то для перехода к стандартной диаграмме Excel вам достаточно будет запустить этот ...
... как или нажать клавишу <F12>. Появится окно сохранения макроса. Введите в поле ввода имя макроса, соблюдая правила именования объектов Access, например, менеджеры по продажам. 2.2. Создание групп макросов При разработке приложения с использованием макросов количество макросов может оказаться очень большим. Поэтому важно хорошо организовать доступ к нужным макросам. Для этого в одном ...
... макроса с относительными ссылками В этом примере вам предстоит создать макрос с относительными ссылками для размещения заголовка таблицы продаж компьютеров в произвольном месте рабочей книги. Перед созданием макроса включите режим записи с относительными ссылками. Для этого выполните следующие действия: · Выполните команду Сервис | Запись макроса | С относительными ссылками. · ...
... в підготовки молодшого фахівця; · розробка фрагмента поурочно-тематичного плану. На основі аналізу перспективно-тематичного плану, для подальшої розробки вибираємо тему уроку: «Створення і редагування макросів в інтерактивних документах засобами Word»2. Організація і методика уроку обраної теми Тема: «Створення і редагування макросів в інтерактивних документах засобами Word» Ціль: ...
0 комментариев