Чем отличаются инлайн-функции от макросов?
#define Max(x,y) ((x)>(y)?(x):(y))
inline int Max(int x, int y)
{
return x>y?x:y;
}
Макросы обрабатываются препроцессором, а инлайн-функции компилятором.
Макрос не будет делать проверку типа и вычислять аргументы. Для Max(++x, y) результат будет разным.
Макросы не обращают внимания на пространство имен. Если объявить функцию Max, скажем, внутри класса, то она не перекроет макрос.
Макросы сложнее отлаживать, компилятор не видит макросы и не сможет точно сказать где произошла ошибка. Это особенно неудобно, если макрос большой.
Thanksgiving
5 дней назад
6 коммент.:
Любопытно, что на job interviews теперь проводят параллели не только inline/macro, но и macro/templates. По крайней мере, у Microsoft так.
Прошу прощения, если поднял слишком давнюю тему :)
Всё это верно, но есть область, где макросы незаменимы — при составлении синтаксических конструкций, подобно MAP'ам (ATL/WTL, MFC). Как составить подобные карты, используя другие средства (шаблоны, например)?
Прошу прощения, если поднял слишком давнюю тему :)
Ничего в этом плохого не вижу :-). Хотя комментарии на главной странице не отобразятся, к сожалению...
Всё это верно, но есть область, где макросы незаменимы — при составлении синтаксических конструкций, подобно MAP'ам (ATL/WTL, MFC). Как составить подобные карты, используя другие средства (шаблоны, например)?
Если для решения какой-либо задачи макросы подходят лучше всего, я буду использовать макросы. Этим постом я вовсе не хотела сказать, что макросы - зло. У них есть определенные отличия от inline функций, об этом просто надо знать...
Что касается MFC. Я его смотрела довольно давно, когда выбирала между MFC и VCL. Мне кажется, что макросов там могло бы быть и поменьше. С другой стороны, я не знаю почему там были приняты именно такие решения и предлагать что-либо взамен было бы слишком самонадеянно. Выбрала я в итоге VCL.
> Этим постом я вовсе не хотела сказать, что макросы - зло.
Это предназначалось для jim'a :)
> Мне кажется, что макросов там могло бы быть и поменьше
Согласен.
Макросы сложнее отлаживать, компилятор не видит макросы и не сможет точно сказать где произошла ошибка. Это особенно неудобно, если макрос большой.
Мне вообще не понятно зачем использовать длиные макроопределения, практически все можно реализовать на inline-функциях, да наверное подобные реализации говорят о неправильном подходе к решению задачи.
А кто-нибудь знает, что за макрос @#
В книге Бондарева сказано, что приведение символа, но никак не расшифровывается и примеров нет, а в интернете сплошой копипаст с его книги...
Отправить комментарий