Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В чем преимущество макросов?? В чем преимущество макросов над ф-ми 
V
    Опции темы
666TEHb666
Дата 16.8.2009, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 5.10.2008
Где: Новокузнецк

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



Помогите разобраться. Столкнулся с макросами. Приблизительно понял что эт такое. По сути те же функции,дык зачем тогда они нужны?Почему нельзя просто также описывать функции без всяких директив #define и т.д.
Или есть какието преимущества макросов?Если да то какие?

Все поисковые запросы мои увенчались тем что я находил описания что эт такое. Поэтому и возник сей вопрос..

Заранее спасибо
PM MAIL ICQ Skype   Вверх
mes
Дата 16.8.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(666TEHb666 @  16.8.2009,  20:19 Найти цитируемый пост)
Все поисковые запросы мои увенчались тем что я находил описания что эт такое. Поэтому и возник сей вопрос..


Цитата(666TEHb666 @  16.8.2009,  20:19 Найти цитируемый пост)
По сути те же функции 

посоветовал бы еще раз прочитать что это такое. 
А то что Вам не видится их применения, так это даже очень хорошо - меньше макросов, меньше головных болей smile


--------------------
PM MAIL WWW   Вверх
SVN74
Дата 16.8.2009, 21:32 (ссылка)   | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну почему же. Макросы довольно удобная вещь. К примеру, - если надо объявить кучу переменных с заранее известным размером, -  N число, а потом в процессе если понадобится заменить N число, то придется  перебрать весь код заново, а так поменял в define(е)...
PM MAIL WWW   Вверх
zim22
Дата 16.8.2009, 21:35 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(SVN74 @  16.8.2009,  21:32 Найти цитируемый пост)
- если надо объявить кучу переменных с заранее известным размером, -  N число

для этой цели в С++ существуют константы времени компилиции.


--------------------
PM MAIL   Вверх
Galaran
Дата 16.8.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Для переменных можно использовать константы
Опередили =)

Это сообщение отредактировал(а) Galaran - 16.8.2009, 21:39
PM MAIL   Вверх
jonie
Дата 16.8.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



насчет переменных - можно использовать enum, а не макросы. Макросы заменяют просто текст, в то время как enum - конструкция языковая.

Я знаю только одно действительно мне нужное использование макросов:
Код

#define LOG(x) std::cerr<<(x)<<std::endl

тогда можно писать так:

LOG( "Oops....code ["<<errroCode<<"]" );



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
SVN74
Дата 16.8.2009, 21:46 (ссылка)  | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Или так (Builder2009) :  smile 
    
Код

#define Печать(x) std::cout << x << std::endl;

          Печать("Hello");

PM MAIL WWW   Вверх
jonie
Дата 16.8.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



юмор не понял.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mes
Дата 16.8.2009, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(SVN74 @  16.8.2009,  20:32 Найти цитируемый пост)
Ну почему же. Макросы довольно удобная вещь.

И опасная, поэтому если человек не понимает для чего она нужна, лучше не использовать.


Цитата(SVN74 @  16.8.2009,  20:32 Найти цитируемый пост)
если надо объявить кучу переменных с заранее известным размером, -  N число, а потом в процессе если понадобится заменить N число, то придется  перебрать весь код заново, а так поменял в define(е)...

И где интересно такому учат  smile  А определить одну  константу и дальше ее использовать что мешает ?



--------------------
PM MAIL WWW   Вверх
SVN74
Дата 16.8.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(jonie @  16.8.2009,  21:47 Найти цитируемый пост)
юмор не понял

А че ту понимать.. РАБОТАЕТ в VS 2008 и C++Builder 2009  smile

Добавлено через 2 минуты и 11 секунд
Цитата(mes @  16.8.2009,  21:50 Найти цитируемый пост)
И где интересно такому учат    А определить одну  константу и дальше ее использовать что мешает ?

Никто не спорит, конечно можно....
PM MAIL WWW   Вверх
jonie
Дата 16.8.2009, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
А че ту понимать.. РАБОТАЕТ в VS 2008 и C++Builder 2009  

и чему вы удивлены собственно? стандарт запрещает использовать не ansi ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
SVN74
Дата 16.8.2009, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(jonie @  16.8.2009,  21:57 Найти цитируемый пост)
и чему вы удивлены собственно? стандарт запрещает использовать не ansi ? 

Оно то так, только это стало почему то выполняться в этих версиях, - можно ж было запретить это...
PM MAIL WWW   Вверх
sdukshis
Дата 16.8.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(666TEHb666 @ 16.8.2009,  21:19)
Помогите разобраться. Столкнулся с макросами. Приблизительно понял что эт такое. По сути те же функции,дык зачем тогда они нужны?Почему нельзя просто также описывать функции без всяких директив #define и т.д.
Или есть какието преимущества макросов?Если да то какие?

Все поисковые запросы мои увенчались тем что я находил описания что эт такое. Поэтому и возник сей вопрос..

Заранее спасибо

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

Например
Код

#define MIN(x,y)  ((x) < (y))?(x):(y)
#define MAX(x,y)  ((x) < (y))?(y):(x)


В C++ такие макросы не нужны, поскольку есть встраиваемые функции.
PM MAIL   Вверх
666TEHb666
Дата 17.8.2009, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 5.10.2008
Где: Новокузнецк

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



Цитата(mes @  16.8.2009,  21:30 Найти цитируемый пост)
посоветовал бы еще раз прочитать что это такое. 
А то что Вам не видится их применения, так это даже очень хорошо - меньше макросов, меньше головных болей  


Ну раз я неправильно понимаю их назначения может объясните?По крайней мере хотя бы смогу сам понять достоинства/недостатки. а так я представляю их пока только функциями/константами...


Цитата(SVN74 @  16.8.2009,  21:32 Найти цитируемый пост)
Ну почему же. Макросы довольно удобная вещь. К примеру, - если надо объявить кучу переменных с заранее известным размером, -  N число, а потом в процессе если понадобится заменить N число, то придется  перебрать весь код заново, а так поменял в define(е)... 


Именно поэтому я задал вопрос)) С помощью макросов как я понял можно написать функции..зачем если их можно оисать точно ткже в теле прграммы или еще лучше в длл и заинклдить а не перемешивать эти макросы с хидерами,устраивая в программе кашу...мое мнение..аналогично с переменными..существуют константы..кроме того их можно объявить еще и по тексту программы..опять же зачем макросы?))


Цитата(jonie @  16.8.2009,  21:37 Найти цитируемый пост)
Я знаю только одно действительно мне нужное использование макросов:


а в чем проблема также функцию написать?


Цитата(mes @  16.8.2009,  21:50 Найти цитируемый пост)
И опасная, поэтому если человек не понимает для чего она нужна, лучше не использовать.



Интересная стратегия говорить как опасны макросы и какая от них головная боль не объяснив в чем именно опасность и суть =) Поясните вашу точку зрения. В чем опасность?


Цитата(sdukshis @  16.8.2009,  23:17 Найти цитируемый пост)
Макросы можно использовать для избежания лишних вызовов функций и, таким образом, оптимизации по времени выполнения.


Единственный ответ вроде бы по сути...Благодарю. Хотя было бы интересно узнать оправдывает ли оптимизация нагромождение (мое мнение) кода.


Цитата(andrew_121 @  17.8.2009,  00:02 Найти цитируемый пост)
...


Очень информативно =) xD Благодарю =) Мне все сразу стало ясно %)
PM MAIL ICQ Skype   Вверх
mes
Дата 17.8.2009, 04:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(666TEHb666 @  17.8.2009,  00:51 Найти цитируемый пост)
Ну раз я неправильно понимаю их назначения может объясните?По крайней мере хотя бы смогу сам понять достоинства/недостатки. а так я представляю их пока только функциями/константами...

использование в качестве функций или констант это лишь частный (и зачастую не лучший) случай использования макросов. Макросы предназначены для управляемой генерации исходного кода.
Вот первый пришедший в голову пример : Допустим нам надо объявить некое кол-во строковых констант, к оформлению значений каждой из которых предъявляются определенные требования,
в нашем случае допустим шаблон должен выглядить так : <prefix%s>, тогда реализация может выглядить так :
Код

#define  DEF_CMD(name, value)const std::string name = "<" CMD_PREFIX # value ">";
#define  CMD_PREFIX "CMD::"
namespace Cmd {

DEF_CMD(Start,  START)
DEF_CMD(Stop,   STOP)
DEF_CMD(Pause,  PAUSE)
DEF_CMD(Any,    0000)
...
}
#undef CMD_PREFIX
#undef DEF_CMD

//main()
std::cout << Cmd::Start;



Цитата(666TEHb666 @  17.8.2009,  00:51 Найти цитируемый пост)
Цитата

Я знаю только одно действительно мне нужное использование макросов:

а в чем проблема также функцию написать?

Потому что можно
Код

#ifdef DEBUG
#define LOG(x)  std::cerr<<x<<std::endl
#else
#define LOG(x)
#endif

и значение  x не будет вычисляться если лог не ведется.

Цитата(666TEHb666 @  17.8.2009,  00:51 Найти цитируемый пост)
Интересная стратегия говорить как опасны макросы и какая от них головная боль не объяснив в чем именно опасность и суть =) Поясните вашу точку зрения. В чем опасность?

ну вот Вам простенький пример для разминки : 

Код

#define MIN (a,b) ((a)<(b)?(a):(b))

int main(void)
{
  int a=3;
  int b=3;
  std::cout << MIN(a,++a)<<std::endl;
  std::cout << MIN(++b,b)<<std::endl;

  return 0;
}

вначале исправьте ошибку компиляции, а потом объясните полученный результат smile

пример подправлен/упрощен в связи с нижеследующим постом azesmcar`a

Это сообщение отредактировал(а) mes - 17.8.2009, 11:15


--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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