Linux программирование в примерах
Шрифт:
Эта методика работает; мы сами ее использовали и видели, как ее рекомендуют в учебниках. Однако, она может быть усовершенствована и дальше с уменьшением количества макросов до одного:
Обратите внимание на то, как макрос извлекается с двумя наборами скобок! Поместив весь список аргументов для
Если вы используете компилятор, удовлетворяющий стандарту С 1999 г., у вас есть дополнительный выбор, который дает наиболее чистый отладочный код:
Стандарт С 1999 г. предусматривает варьирующий макрос (variadic macros); т.е. макрос, который может принимать переменное число аргументов. (Это похоже на варьирующую функцию, наподобие
Преимуществом этого механизма является то, что при извлечении отладочного макроса необходим лишь один набор скобок, что делает чтение кода значительно более естественным. Это также сохраняет возможность использовать всего одно имя макроса вместо нескольких, которые меняются в соответствии с числом аргументов. Недостатком является то, что компиляторы C99 пока еще доступны не так широко, что снижает переносимость этой конструкции. (Однако, эта ситуация будет со временем улучшаться.)
Рекомендация: Текущие версии GCC поддерживают варьирующие макросы. Таким образом, если вы знаете, что никогда не будете использовать для компилирования своих программ что-то, кроме GCC (или какого-нибудь другого компилятора C99), можете использовать механизм C99. Однако, на момент написания, компиляторы C99 все еще не являются обычным явлением. Поэтому, если ваш код должен компилироваться разными компиляторами, следует использовать макрос в стиле с двумя парами скобок.
15.4.1.2. По возможности избегайте макросов с выражениями
В общем, макросы препроцессора С являются довольно острой палкой с двумя концами. Они предоставляют вам большую мощь, но также и большую возможность пораниться самому. [169]
Обычно
169
Bjarne Stroustrup, создатель С++, настойчиво работал над тем, чтобы сделать использование препроцессора С совершенно ненужным в С++. По нашему мнению, он не вполне добился успеха:
На первый взгляд, он выглядит замечательно. Условие '
В таком случае нужно разыскать определение макроса и вывести развернутое значение.
Рекомендация: Для представления важных условий в своей программе используйте переменные, значения которых при изменении условий явным образом меняется в коде.
Вот сокращенный пример из
После установки и сохранения
ЗАМЕЧАНИЕ. Начиная с GCC 3.1 и версии 5 GDB, если вы компилируете свою программу с опциями
Однако, использовать макросы таким способам позволяет лишь комбинация GCC, GDB и специальных опций: если вы не используете GCC (или если вы используете более старую версию), у вас все еще есть проблема. Мы придерживаемся своей рекомендации избегать по возможности таких макросов.
Проблема с макросами распространяется также и на фрагменты кода. Если макрос определяет несколько операторов, вы не можете установить контрольную точку в середине макроса. Это верно также для inline-функций C99 и С++: если компилятор заменяет тело inline-функции сгенерированным кодом, снова невозможно или трудно установить внутри него контрольную точку. Это имеет связь с нашим советом компилировать лишь с одной опцией
Я уже бог. Книга XL
40. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
рейтинг книги
Fortuna Caeca Est (Судьбы судебный приговор). Книга 1.
Фантастика:
фэнтези
рейтинг книги
Эпоха Опустошителя. Том II
2. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
рейтинг книги
Ермак. Телохранитель
2. Ермак
Фантастика:
альтернативная история
рейтинг книги
Будущее, XXII век. Прогрессоры
Гиганты фантастики
Фантастика:
научная фантастика
рейтинг книги
Распутин
Проза:
историческая проза
рейтинг книги
Мы друг друга не выбирали
1. Мы выбираем...
Любовные романы:
остросюжетные любовные романы
прочие любовные романы
современные любовные романы
рейтинг книги
Инквизитор. Омнибус. Пенталогия
6. Цикл книг про инквизиторов Эйзенхорна и Рейвенора
Фантастика:
боевая фантастика
рейтинг книги
Труд
Проза:
классическая проза
рейтинг книги
Из третьего мира – в первый. История Сингапура (1965–2000)
Научно-образовательная:
педагогика
рейтинг книги
Хозяйка Изумрудного города
Любовные романы:
остросюжетные любовные романы
рейтинг книги
Записки брюнетки
Проза:
современная проза
рейтинг книги
Я еще князь. Книга XX
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
рейтинг книги
Листик, приключения продолжаются.
Фантастика:
фэнтези
ужасы и мистика
рейтинг книги