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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> inline VS macros 
V
    Опции темы
hils
Дата 15.8.2011, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



дело вкуса или есть явное преимущество?

например, пишу короткую фанкшн для вычисления максимума:

I. 
Код

inline int max( int a, int b)
{
return a>b ? a : b;
}


или 

II. 
Код

#define max(a, b)   ((a)>(b) ? (a) : (b))




Это сообщение отредактировал(а) hils - 15.8.2011, 20:13
PM MAIL   Вверх
mes
Дата 15.8.2011, 19:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(hils @  15.8.2011,  18:28 Найти цитируемый пост)
или 

http://liveworkspace.org/code/a883d190a9fa...07debdee65a3805
Код

#include <iostream>

#define max(a, b)   (a)>(b) ? (a) : (b)

int main ()
{
   std::cout << (2* max (3,5));
}

Цитата

3



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


Новичок



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

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



точно в бровь, 
поставил недостающие скобки:

Код

#define max(a, b)   ((a)>(b) ? (a) : (b))




PM MAIL   Вверх
spyswamp
Дата 15.8.2011, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



hils, вот тебе и еще 1 камень в огород макросов. И вообще, пора бы уже запомнить про то, что есть std::max().


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
hils
Дата 15.8.2011, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



spyswamp, я так понимаю при написании программы на С++ от макросов стоит отказаться и лучше использовать подставляемые функции?
PM MAIL   Вверх
Фантом
Дата 15.8.2011, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(hils @  15.8.2011,  20:37 Найти цитируемый пост)
я так понимаю при написании программы на С++ от макросов стоит отказаться и лучше использовать подставляемые функции? 

Да. Пример выше, конечно, был не совсем удачным  smile, но все-таки вероятность подобных ошибок при использовании макросов достаточно велика, а преимуществ по сравнению с inline-функциями они не дают.

И, кстати, C это тоже касается - в C99 inline есть.
PM   Вверх
azesmcar
Дата 16.8.2011, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(hils @  15.8.2011,  19:28 Найти цитируемый пост)
дело вкуса или есть явное преимущество?

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

Цитата(hils @  15.8.2011,  20:12 Найти цитируемый пост)
поставил недостающие скобки:

Скобки тебя не спасут
Код

int x = 0;
std::cout << (max(++x, 0)) << std::endl;
std::cout << x << std::endl;


PM   Вверх
volatile
Дата 16.8.2011, 11:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Кроме всего что говорилось, глобально заняты такие классные имена как max(), min();
Нельзя, например их использовать в качестве имен методов
Код

struct s
{
   void max () {};
};
Это не скомпилится, потому что произойдет подстановка макроса. Неожиданно, правда ?
В винде кстати, эти макросы определены по умолчанию, и немного мешают жить. Но их можно отключить, задефайнив
#define NOMINMAX
перед 
#include <windows.h>

PM MAIL   Вверх
hils
Дата 16.8.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пометил вопрос как решенный, всем спасибо!

Это сообщение отредактировал(а) hils - 16.8.2011, 16:37
PM MAIL   Вверх
spyswamp
Дата 16.8.2011, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



volatile, а я обычно вместо еще одного дефайна делаю андефайн. smile


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
volatile
Дата 16.8.2011, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(spyswamp @  16.8.2011,  18:55 Найти цитируемый пост)
 я обычно вместо еще одного дефайна делаю андефайн.

Можно и так конечно, но тогда, во избежание недоразумений, нужно делать так
Код

#ifdef max
#undef max
#endif

#ifdef min
#undef min
#endif
и не забыть это проделывать каждый раз, после  #include <windows.h>

я обычно ограничиваюсь дефайном единственного #define NOMINMAX
тем более что он специально для этого и предназначен.
И в этом случае, никакого еще одного дефайна нет.  min() max(), просто не дефайнятся вообще ни на секунду.
 smile 
PM MAIL   Вверх
spyswamp
Дата 17.8.2011, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



оффтоп: volatile, "недоразумения" - слушай, я запомню этот красивый эвфемизм для криворуких кодеров, которые дефайнят всякую хрень. smile


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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