Beldesignru 0 16 октября, 2013 Опубликовано 16 октября, 2013 (изменено) · Жалоба Всем привет. Что нужно сделать чтобы в GCC заработали макросы следующего типа: #define max(x, y) ({ \ typeof(x) _max1 = (x); \ typeof(y) _max2 = (y); \ (void) (&_max1 == &_max2); \ _max1 > _max2 ? _max1 : _max2; }) У меня 4.7 версия GCC, но что-то не срастается. Заранее спасибо за ответы. Изменено 16 октября, 2013 пользователем Beldesignru Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 16 октября, 2013 Опубликовано 16 октября, 2013 · Жалоба да вроде как макрос это просто текстовая замена. Значит чтобы они заработали надо чтобы заработало то выражение на которое меняете. не очень понятно зачем такая строчка (void) (&_max1 == &_max2); typeof(x) - это какой то C#, не помню чтобы в С была поддержка определения типа... я бы сделал проще #define max(x, y) ((x > y) ? x : y) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 16 октября, 2013 Опубликовано 16 октября, 2013 · Жалоба У меня 4.7 версия GCC, но что-то не срастается. Что конкретно не срастается? Разверните макрос в исходнике руками и посмотрите на ругань компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 16 октября, 2013 Опубликовано 16 октября, 2013 · Жалоба typeof(x) - это расширение. Чтоб заработало, надо выбрать стандарт при помощи опции -std=gnu99. Вроде как в gcc эта опция включена по умолчанию. Так что скорее всего, у вас где-то указано -std=c90 или -ansi. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 17 октября, 2013 Опубликовано 17 октября, 2013 · Жалоба Присоединяюсь к вопросу Golikovа, для чего это: (void) (&_max1 == &_max2); To Golikov: ваш пример стоит обязательно доработать, расставив скобочки: #define max(x, y) (((x) > (y)) ? (x) : (y)) Для чего это делается в интернете написано неоднократно. 2TC: А по теме Антоха вам всё верно ответил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 октября, 2013 Опубликовано 17 октября, 2013 · Жалоба To Golikov: ваш пример стоит обязательно доработать, расставив скобочки:#define max(x, y) (((x) > (y)) ? (x) : (y)) Для чего это делается в интернете написано неоднократно. ОК:) скобки никогда лишними не бывают, а поскольку мировой запас их неограничен, то я их пихаю даже в очевидных местах, чисто на всякий случай. А уж в макросах вы правы, сам бог велел... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beldesignru 0 19 октября, 2013 Опубликовано 19 октября, 2013 · Жалоба typeof(x) - это расширение. Чтоб заработало, надо выбрать стандарт при помощи опции -std=gnu99. Вроде как в gcc эта опция включена по умолчанию. Так что скорее всего, у вас где-то указано -std=c90 или -ansi. Спасибо, Антон! Помогло. Почему-то по умолчанию было ansi... Всем спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 19 октября, 2013 Опубликовано 19 октября, 2013 · Жалоба не очень понятно зачем такая строчка (void) (&_max1 == &_max2); А это проверка соответствия типов параметров. Объяснение вот тут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 20 октября, 2013 Опубликовано 20 октября, 2013 · Жалоба Спасибо. Но это какой то пипец, реально. Если GCC дает варнинги на сравнение указателей разных типов, то что он делает с присваиваниями? Я постоянно использую имя массива как адрес его первого символа, я бы погиб бы в варнингах%)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 20 октября, 2013 Опубликовано 20 октября, 2013 · Жалоба что он делает с присваиваниями? Как что? Правила приведения типов при присваивании расписаны в стандарте языка. Но вообще этот макрос - зло, так как он непереносим. Я бы сделал традиционно: #define max(a, b) ((a) > (b) ? (a) : (b)) Ну и добавил бы проверку на отсутствие побочных эффектов, вроде бы есть для этого подходящие гнуизмы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 20 октября, 2013 Опубликовано 20 октября, 2013 · Жалоба Но вообще этот макрос - зло, так как он непереносим. Я бы сделал традиционно: #define max(a, b) ((a) > (b) ? (a) : (b)) Дело в том, что этот макрос - из ядра линукса, так что переносимость ему особо не нужна. Ваш вариант проигрывает ему в том, что значение выражения a или b будет вычислено более одного раза. То есть, если в качестве a или b передать функцию, то она может быть вызвана дважды. И если эта функция с побочными эффектами, то получится совсем нехорошо. ЗЫ. Всё это прекрасно и переносимо разруливается плюсами и шаблонами, но тов. Торвальдс не любит плюсы:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться