ВНИМАНИЕ!
Поскольку макрос assert не работает в финальном выпуске, выполнение критически важных для функционирования приложения проверок (например, возвращаемое значение оператора dynamic_cast) следует обеспечить от дельно, используя оператор if. Макрос assert позволяет обнаруживать про блемы, но это вовсе не замена проверки указателя, необходимая в коде.
Преимущества и недостатки использования макрофункций
акросы позволяю т многократно использовать некоторые вспомогательные функ ции независимо от типа используемых переменных. Вернемся к следую щ ей строке из листинга 14.2:
#define MIN(а, b) (((а) < (Ь)) ? (а) : (Ь))
Эту макрофункцию M IN можно использовать для целых чисел:
cout « MIN(25 , 101 ) « endl;
Но ее же можно использовать для типа d o u b le :
cout << MIN(0 .1 , 0 .2 ) « endl;
Обратите внимание, что, если бы функция M IN () была обычной, вам приш лось бы создать два ее варианта: M IN _ IN T (), получающий параметры типа i n t и возвращающий тип in t , и M IN _DOUBLE ( ) , делающий то же самое, но с типом d o u b le . Эта оптимизация
сокращение строк кода являются небольшим преимуществом и соблазняют некоторых программистов на использование макроса для определения простых вспомогательных функций. Эти макрофункции разворачиваются и встраиваются в код перед компиляцией,
следовательно, производительность простого макроса выше, чем у обычного вызова
360 ЗАНЯТИЕ 14. Макросы и шаблоны
функции, решающего ту же задачу. Это связано с тем, что вызов функции требует созда ния стека вызовов, передачи аргументов и т.д., так что дополнительные затраты зачастую занимают больше процессорного времени, чем обработка самой функции MIN.
Несмотря на все эти преимущества, макросы представляет серьезную проблему: они не поддерживают никаких форм безопасности типов. Если этого недостаточно, то отладка макроса также весьма непростое дело.
Если цеобходимо создать обобщенные функции, которые не зависят от типа, но все же обеспечивают их безопасность, лучше использовать шаблон функции вместо макрофунк ции. Если необходимо увеличить производительность, объявите функцию встраиваемой
( i n l i n e ) .
Вы уже познакомились со встраиваемыми функциями и использованием ключевого слова i n l i n e в листинге 7.10 на занятии 7, “Организация кода при помощи функций” .
РЕКОМЕНДУЕТСЯ
Создавайте собственные макрофункции по возможности реже
Используйте вместо макроса, если возможно, константы
Помните, что макрос не обеспечивает безопас ности типов и препроцессор никак не контро лирует соответствия типов
Do'stlaringiz bilan baham: |