пятница, января 28, 2005

Инлайн-функции и макросы

Чем отличаются инлайн-функции от макросов?

#define Max(x,y) ((x)>(y)?(x):(y))

inline int Max(int x, int y)
{
return x>y?x:y;
}

Макросы обрабатываются препроцессором, а инлайн-функции компилятором.

Макрос не будет делать проверку типа и вычислять аргументы. Для Max(++x, y) результат будет разным.

Макросы не обращают внимания на пространство имен. Если объявить функцию Max, скажем, внутри класса, то она не перекроет макрос.

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

7 коммент.:

Jim комментирует...

Макросы - ЗЛО! В подтверждение этого, обращу внимание, что и сам термин то начинается с тех же букв, что и "макдональдс"!

wasker комментирует...

Любопытно, что на job interviews теперь проводят параллели не только inline/macro, но и macro/templates. По крайней мере, у Microsoft так.

icestudent комментирует...

Прошу прощения, если поднял слишком давнюю тему :)

Всё это верно, но есть область, где макросы незаменимы — при составлении синтаксических конструкций, подобно MAP'ам (ATL/WTL, MFC). Как составить подобные карты, используя другие средства (шаблоны, например)?

Alena комментирует...

Прошу прощения, если поднял слишком давнюю тему :)

Ничего в этом плохого не вижу :-). Хотя комментарии на главной странице не отобразятся, к сожалению...

Всё это верно, но есть область, где макросы незаменимы — при составлении синтаксических конструкций, подобно MAP'ам (ATL/WTL, MFC). Как составить подобные карты, используя другие средства (шаблоны, например)?

Если для решения какой-либо задачи макросы подходят лучше всего, я буду использовать макросы. Этим постом я вовсе не хотела сказать, что макросы - зло. У них есть определенные отличия от inline функций, об этом просто надо знать...
Что касается MFC. Я его смотрела довольно давно, когда выбирала между MFC и VCL. Мне кажется, что макросов там могло бы быть и поменьше. С другой стороны, я не знаю почему там были приняты именно такие решения и предлагать что-либо взамен было бы слишком самонадеянно. Выбрала я в итоге VCL.

icestudent комментирует...

> Этим постом я вовсе не хотела сказать, что макросы - зло.
Это предназначалось для jim'a :)

> Мне кажется, что макросов там могло бы быть и поменьше
Согласен.

flashpoint комментирует...

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

Анонимный комментирует...

А кто-нибудь знает, что за макрос @#
В книге Бондарева сказано, что приведение символа, но никак не расшифровывается и примеров нет, а в интернете сплошой копипаст с его книги...