Модераторы: Се ля ви
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Макрос define или функция 
:(
    Опции темы
ertyuo
Дата 6.1.2010, 00:26 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 5.1.2010

Репутация: нет
Всего: нет



В различных ЯП применяется define, так вот в статье про define прочитал, что данную директиву можно использовать еще как функцию, ну или макрос:
#define S_Fig(x) (x * x)
 В связи с этим возник вопрос. А что по ресурсам лучше использовать функции или define? И можно ли в define передавать несколько параметров сразу? Например:
#define S_Fig(a,b) ((a*b) * (a+b))
Просто в некоторых приложениях своих иногда накручиваю уж слишком много функций и различных переменных, было бы в разы легче использовать именно директиву define, которая занимает всего одну строчку.
PM   Вверх
Фантом
Дата 6.1.2010, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 0
Всего: 49



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

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

Думаете, 25? Ничего подобного, 11.  smile  Соответственно, о всех других соображениях можно раз и навсегда забыть. Микроскопический выигрыш от использования макросов не стоит стандартной кучи ошибок, которые при этом вылезают.
PM   Вверх
ertyuo
Дата 6.1.2010, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 5.1.2010

Репутация: нет
Всего: нет



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

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


Да читал про этот момент там же. Но вот ни разу не было ситуаций на практике, когда нужно было передавать не 5, а сумму (4+1 или 2+3)... Данная ситуация все же исключение, чем обыденность. Да и в define можно же взять каждый отдельный аргумент в круглые скобки - да не удобно, но кода-то меньше будет=)
PM   Вверх
djamshud
Дата 6.1.2010, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: нет
Всего: 39



>Думаете, 25? Ничего подобного, 11.

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

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

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

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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Фантом
Дата 6.1.2010, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 0
Всего: 49



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

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


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

Можно, но ради чего? В языке существует нормальный инструмент, позволяющий получить то же самое, но корректным образом - inline-функции.
PM   Вверх
Shaggie
Дата 6.1.2010, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



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

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

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

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


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
Фантом
Дата 6.1.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 0
Всего: 49



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

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

Ну, положим, есть - не обязательно пользоваться именно C.  smile А если серьезно, то да, конечно, но это уже достаточно узкая область.
PM   Вверх
djamshud
Дата 6.1.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: нет
Всего: 39



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

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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила раздела "Философия программирования":
Се ля ви

Форум "Философия программирования" предназначен для обсуждения вопросов, так или иначе связанных с философскими аспектами разработки ПО:

• вопросы перспективного развития методов написания ПО;

• изменяющиеся языки и методологии программирования;


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Философия программирования | Следующая тема »


 




[ Время генерации скрипта: 0.1013 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.