Перейти к содержанию
    

Поддеркжа макросов GCC

Всем привет.

Что нужно сделать чтобы в GCC заработали макросы следующего типа:

#define max(x, y) ({ \

typeof(x) _max1 = (x); \

typeof(y) _max2 = (y); \

(void) (&_max1 == &_max2); \

_max1 > _max2 ? _max1 : _max2; })

У меня 4.7 версия GCC, но что-то не срастается.

Заранее спасибо за ответы.

Изменено пользователем Beldesignru

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да вроде как макрос это просто текстовая замена. Значит чтобы они заработали надо чтобы заработало то выражение на которое меняете.

 

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

 

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

 

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

 

#define max(x, y) ((x > y) ? x : y)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня 4.7 версия GCC, но что-то не срастается.

Что конкретно не срастается? Разверните макрос в исходнике руками и посмотрите на ругань компилятора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

typeof(x) - это расширение. Чтоб заработало, надо выбрать стандарт при помощи опции -std=gnu99.

Вроде как в gcc эта опция включена по умолчанию. Так что скорее всего, у вас где-то указано -std=c90 или -ansi.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяюсь к вопросу Golikovа, для чего это:

(void) (&_max1 == &_max2);

To Golikov: ваш пример стоит обязательно доработать, расставив скобочки:

#define max(x, y) (((x) > (y)) ? (x) : (y))

Для чего это делается в интернете написано неоднократно.

 

2TC: А по теме Антоха вам всё верно ответил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Для чего это делается в интернете написано неоднократно.

 

ОК:)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

typeof(x) - это расширение. Чтоб заработало, надо выбрать стандарт при помощи опции -std=gnu99.

Вроде как в gcc эта опция включена по умолчанию. Так что скорее всего, у вас где-то указано -std=c90 или -ansi.

Спасибо, Антон! Помогло.

Почему-то по умолчанию было ansi...

 

Всем спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А это проверка соответствия типов параметров.

Объяснение вот тут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

Но это какой то пипец, реально. Если GCC дает варнинги на сравнение указателей разных типов, то что он делает с присваиваниями? Я постоянно использую имя массива как адрес его первого символа, я бы погиб бы в варнингах%)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что он делает с присваиваниями?

Как что? Правила приведения типов при присваивании расписаны в стандарте языка.

Но вообще этот макрос - зло, так как он непереносим. Я бы сделал традиционно:

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

Ну и добавил бы проверку на отсутствие побочных эффектов, вроде бы есть для этого подходящие гнуизмы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Ваш вариант проигрывает ему в том, что значение выражения a или b будет вычислено более одного раза. То есть, если в качестве a или b передать функцию, то она может быть вызвана дважды. И если эта функция с побочными эффектами, то получится совсем нехорошо.

ЗЫ. Всё это прекрасно и переносимо разруливается плюсами и шаблонами, но тов. Торвальдс не любит плюсы:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...