Информация об изменениях

Сообщение Re: Ключевое отличие шаблона от макроса от 09.07.2023 7:26

Изменено 09.07.2023 7:47 rg45

Re: Ключевое отличие шаблона от макроса
Здравствуйте, Shmj, Вы писали:

S>Вот тут
Автор: rg45
Дата: 07.07.23
чел. пишет:


S>

S>Дальше можно не читать. Одно только то, что ты ставишь макросы и шаблоны в один ряд, красноречиво говорит о твоей квалификации. Как говорится, у Вас не тридцатилетний опыт — у Вас годичный опыт, повторенный тридцать раз.


S>Т.е. заклеймили даже за саму попытку поставить в один ряд. И мне не ясно почему.


Тезисно:
  • Шаблоны обрабатываются копилятором, а макросы обрабатываются препроцессором
  • Макросы не подчиняются правилам пространств имен и областей видимости
  • Макросы не подчиняются правилам поиска имен — name lookup и argument-dependent name lookup
  • Для макросов недоступны специализации и перегрузки
  • Для макросов недоступно огромное количество инструментов и паттернов, доступных для шаблонов — концепты, SFINAE, variadic packs, template class argument deduction и пр.
  • Макросы небезопасны в плане скрытых побочных эффектов (классический пример — max(++a, ++b))
  • Наверняка, еще есть что-то что я навскидку не смог вспомнить

Первый пункт выделен, потому что он мне представляется наиболее важным. Препроцессор гораздо примитивнее компилятора, его ответсвенность — работа с ТЕКСТОМ. У него на входе текст, и на выходе тоже текст — подготовленный для передачи компилятору. Злоупотребление препроцессором для эмуляции программных сущностей (функций и классов) сродни открыванию консервных банок молотком и производству мебели топором.
Re: Ключевое отличие шаблона от макроса
Здравствуйте, Shmj, Вы писали:

S>Вот тут
Автор: rg45
Дата: 07.07.23
чел. пишет:


S>

S>Дальше можно не читать. Одно только то, что ты ставишь макросы и шаблоны в один ряд, красноречиво говорит о твоей квалификации. Как говорится, у Вас не тридцатилетний опыт — у Вас годичный опыт, повторенный тридцать раз.


S>Т.е. заклеймили даже за саму попытку поставить в один ряд. И мне не ясно почему.


Тезисно:
  • Шаблоны обрабатываются копилятором, а макросы обрабатываются препроцессором
  • Макросы не подчиняются правилам пространств имен и областей видимости
  • Макросы не подчиняются правилам поиска имен — name lookup и argument-dependent name lookup
  • Для макросов недоступны специализации и перегрузки
  • Для макросов недоступно огромное количество инструментов и паттернов, доступных для шаблонов — концепты, SFINAE, variadic packs, template class argument deduction и пр.
  • Макросы небезопасны в плане скрытых побочных эффектов (классический пример — max(++a, ++b))
  • Макросы существенно проблематичнее в отладке и поиске ошибок, чем шаблоны.
  • Наверняка, еще есть что-то что я навскидку не смог вспомнить

Первый пункт выделен, потому что он мне представляется наиболее важным. Препроцессор гораздо примитивнее компилятора, его ответсвенность — работа с ТЕКСТОМ. У него на входе текст, и на выходе тоже текст — подготовленный для передачи компилятору. Злоупотребление препроцессором для эмуляции программных сущностей (функций и классов) сродни открыванию консервных банок молотком и производству мебели топором.