Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Поддеркжа макросов GCC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Beldesignru
Всем привет.
Что нужно сделать чтобы в GCC заработали макросы следующего типа:
#define max(x, y) ({ \
typeof(x) _max1 = (x); \
typeof(y) _max2 = (y); \
(void) (&_max1 == &_max2); \
_max1 > _max2 ? _max1 : _max2; })
У меня 4.7 версия GCC, но что-то не срастается.
Заранее спасибо за ответы.
Golikov A.
да вроде как макрос это просто текстовая замена. Значит чтобы они заработали надо чтобы заработало то выражение на которое меняете.

не очень понятно зачем такая строчка (void) (&_max1 == &_max2);

typeof(x) - это какой то C#, не помню чтобы в С была поддержка определения типа...

я бы сделал проще

#define max(x, y) ((x > y) ? x : y)
scifi
Цитата(Beldesignru @ Oct 16 2013, 20:59) *
У меня 4.7 версия GCC, но что-то не срастается.

Что конкретно не срастается? Разверните макрос в исходнике руками и посмотрите на ругань компилятора.
AHTOXA
typeof(x) - это расширение. Чтоб заработало, надо выбрать стандарт при помощи опции -std=gnu99.
Вроде как в gcc эта опция включена по умолчанию. Так что скорее всего, у вас где-то указано -std=c90 или -ansi.
demiurg_spb
Присоединяюсь к вопросу Golikovа, для чего это:
Цитата(Beldesignru @ Oct 16 2013, 20:59) *
(void) (&_max1 == &_max2);

To Golikov: ваш пример стоит обязательно доработать, расставив скобочки:
Код
#define max(x, y) (((x) > (y)) ? (x) : (y))
Для чего это делается в интернете написано неоднократно.

2TC: А по теме Антоха вам всё верно ответил.
Golikov A.
Цитата(demiurg_spb @ Oct 17 2013, 10:23) *
To Golikov: ваш пример стоит обязательно доработать, расставив скобочки:
Код
#define max(x, y) (((x) > (y)) ? (x) : (y))
Для чего это делается в интернете написано неоднократно.


ОКsm.gif
скобки никогда лишними не бывают, а поскольку мировой запас их неограничен, то я их пихаю даже в очевидных местах, чисто на всякий случай. А уж в макросах вы правы, сам бог велел...
Beldesignru
Цитата(AHTOXA @ Oct 16 2013, 21:15) *
typeof(x) - это расширение. Чтоб заработало, надо выбрать стандарт при помощи опции -std=gnu99.
Вроде как в gcc эта опция включена по умолчанию. Так что скорее всего, у вас где-то указано -std=c90 или -ansi.

Спасибо, Антон! Помогло.
Почему-то по умолчанию было ansi...

Всем спасибо!
AHTOXA
Цитата(Golikov A. @ Oct 16 2013, 23:36) *
не очень понятно зачем такая строчка (void) (&_max1 == &_max2);

А это проверка соответствия типов параметров.
Объяснение вот тут.
Golikov A.
Спасибо.
Но это какой то пипец, реально. Если GCC дает варнинги на сравнение указателей разных типов, то что он делает с присваиваниями? Я постоянно использую имя массива как адрес его первого символа, я бы погиб бы в варнингах%)?
scifi
Цитата(Golikov A. @ Oct 20 2013, 09:02) *
что он делает с присваиваниями?

Как что? Правила приведения типов при присваивании расписаны в стандарте языка.
Но вообще этот макрос - зло, так как он непереносим. Я бы сделал традиционно:
Код
#define max(a, b) ((a) > (b) ? (a) : (b))

Ну и добавил бы проверку на отсутствие побочных эффектов, вроде бы есть для этого подходящие гнуизмы.
AHTOXA
Цитата(scifi @ Oct 20 2013, 11:42) *
Но вообще этот макрос - зло, так как он непереносим. Я бы сделал традиционно:
Код
#define max(a, b) ((a) > (b) ? (a) : (b))

Дело в том, что этот макрос - из ядра линукса, так что переносимость ему особо не нужна.
Ваш вариант проигрывает ему в том, что значение выражения a или b будет вычислено более одного раза. То есть, если в качестве a или b передать функцию, то она может быть вызвана дважды. И если эта функция с побочными эффектами, то получится совсем нехорошо.
ЗЫ. Всё это прекрасно и переносимо разруливается плюсами и шаблонами, но тов. Торвальдс не любит плюсыsm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.