Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Философия программирования > Макрос define или функция


Автор: ertyuo 6.1.2010, 00:26
В различных ЯП применяется define, так вот в статье про http://www.mir-koda.ru/full_leson.php?id=9 прочитал, что данную директиву можно использовать еще как функцию, ну или макрос:
#define S_Fig(x) (x * x)
 В связи с этим возник вопрос. А что по ресурсам лучше использовать функции или define? И можно ли в define передавать несколько параметров сразу? Например:
#define S_Fig(a,b) ((a*b) * (a+b))
Просто в некоторых приложениях своих иногда накручиваю уж слишком много функций и различных переменных, было бы в разы легче использовать именно директиву define, которая занимает всего одну строчку.

Автор: Фантом 6.1.2010, 00:50
Цитата(ertyuo @  6.1.2010,  00:26 Найти цитируемый пост)
В различных ЯП применяется define, так вот в статье про define прочитал, что данную директиву можно использовать еще как функцию, ну или макрос:
#define S_Fig(x) (x * x)

Можно, но категорически не нужно. Чтобы было понятно, почему - попробуйте подумать, что Вы получите при последующем, например, таком вызове: S_Fig(2+3).

Думаете, 25? Ничего подобного, 11.  smile  Соответственно, о всех других соображениях можно раз и навсегда забыть. Микроскопический выигрыш от использования макросов не стоит стандартной кучи ошибок, которые при этом вылезают.

Автор: ertyuo 6.1.2010, 02:14
Цитата(Фантом @  6.1.2010,  00:50 Найти цитируемый пост)
Можно, но категорически не нужно. Чтобы было понятно, почему - попробуйте подумать, что Вы получите при последующем, например, таком вызове: S_Fig(2+3).

Думаете, 25? Ничего подобного, 11.  smile  Соответственно, о всех других соображениях можно раз и навсегда забыть. Микроскопический выигрыш от использования макросов не стоит стандартной кучи ошибок, которые при этом вылезают. 


Да читал про этот момент там же. Но вот ни разу не было ситуаций на практике, когда нужно было передавать не 5, а сумму (4+1 или 2+3)... Данная ситуация все же исключение, чем обыденность. Да и в define можно же взять каждый отдельный аргумент в круглые скобки - да не удобно, но кода-то меньше будет=)

Автор: djamshud 6.1.2010, 02:22
>Думаете, 25? Ничего подобного, 11.

Это потому что макрос написан отстойно.

#define S_Fig(x) ((x)*(x))

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

Добавлено через 59 секунд
ertyuo, о, так вы написли про круглые скобки. Я не заметил.

Автор: Фантом 6.1.2010, 02:45
Цитата(ertyuo @  6.1.2010,  02:14 Найти цитируемый пост)
Да читал про этот момент там же. Но вот ни разу не было ситуаций на практике, когда нужно было передавать не 5, а сумму (4+1 или 2+3)...

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


Цитата(ertyuo @  6.1.2010,  02:14 Найти цитируемый пост)
Да и в define можно же взять каждый отдельный аргумент в круглые скобки - да не удобно, но кода-то меньше будет=) 

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

Автор: Shaggie 6.1.2010, 07:35
Цитата(Фантом @  6.1.2010,  02:45 Найти цитируемый пост)
В языке существует нормальный инструмент, позволяющий получить то же самое, но корректным образом - inline-функции. 

Если используется C89 для разработки несвежего embed, то альтернативы нет. Приходится использовать макросы и для задания констант, и в качестве встраиваемых функций. Затраты на вызов функций и постоянная нехватка стековой памяти подталкивают к их грамотному использованию.

Кстати, кодогенерацию без макр не реализовать. При аккуратном использовании и комментировании/документировании даёт хороший профит.

Знает ли кто-нибудь нормальную систему логирования для C/C++, не использующую макросы?

Автор: Фантом 6.1.2010, 15:14
Цитата(Shaggie @  6.1.2010,  07:35 Найти цитируемый пост)

Если используется C89 для разработки несвежего embed, то альтернативы нет.

Ну, положим, есть - не обязательно пользоваться именно C.  smile А если серьезно, то да, конечно, но это уже достаточно узкая область.

Автор: djamshud 6.1.2010, 15:17
>Знает ли кто-нибудь нормальную систему логирования для C/C++, не использующую макросы?

В плюсах можно на темплейтах нагородить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)