Re[2]: constexpr
От: LuciferSaratov Россия  
Дата: 15.01.23 12:28
Оценка: 15 (1) +1
Здравствуйте, rg45, Вы писали:

R>А вот тебе про #define: 16. Избегайте макросов


объясните мне, пожалуйста, почему следует избегать макросов?
доводы из статьи по ссылке я встречал много раз.
меня они не убеждают и входят в противоречие с моим личным опытом.
я не претендую на звание эксперта по С++, но в своей работе я много работаю с кодом на этом языке.
специфика такая, что мне приходится работать со старым (10+ лет) и очень старым (20+ лет) кодом разного качества.

объясню своё непонимание на примере доводов из статьи по ссылке выше:

Основная проблема с макросами С++ заключается в том, что они выглядят гораздо привлекательнее, чем являются таковыми на самом деле. Макросы игнорируют области видимости, игнорируют прочие возможности и правила языка, и заменяют все символы, которые переопределяют при помощи директивы #define, до самого конца файла. Применение макросов внешне походит на имя или вызов функции, но не имеет с ними ничего общего. Макросы "негигиеничны", в том смысле, что они могут быть раскрыты неожиданно, причем превратиться в зависимости от контекста их использования в самые разные конструкции. Подстановка текста, выполняемая макросами, делает написание хотя бы в небольшой степени "приличного" макроса смесью искусства и черной магии.


да, написание годного макроса это действительно сложнее, чем кажется на первый взгляд.
и я согласен, что корявый макрос может быть причиной множества различных проблем с компиляцией кода.
однако, по моему опыту, навести порядок в макросах не так уж и сложно, здесь автор сильно драматизирует.
написать хороший макрос тоже не очень сложно.
на мой взгляд, хороший шаблонный код писать никак не проще.
понять концепцию текстовых замен, которые производятся препроцессором, гораздо проще, чем понять шаблоны С++.

Программисты, которые полагают, что тяжелее всего расшифровать ошибки, связанные с шаблонами, вероятно, просто никогда не имели дела с плохо написанными или неверно использованными макросами. Шаблоны являются частью системы типов С++, и тем самым позволяют компилятору куда лучше справляться с ними, чем с макросами, которые имеют мало общего с языком программирования. Хуже того, в отличие от шаблонов неверные макросы могут быть раскрыты в нечто, что в силу чистой случайности скомпилируется, не имея при этом никакого смысла. И наконец, ошибка в макросе обнаруживается только после того, как макрос раскрывается, а не при его определении.


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

это что касается портирования на другие компиляторы, однако и при отладке кода макросы мне никогда особых проблем не доставляли.
в конце концов, макросы всегда можно раскрыть в нужной части кода и найти ошибку.

однако понять, что не так при ошибке компиляции иных шаблонов, особенно в компиляторах MSVC не самых свежих, мне гораздо сложнее, чем разобраться в коде с макросами.
при этом нет никакого средства, чтобы раскрыть шаблон и превратить его в нешаблонный код.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.