The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Первая альфа версия новой микроядерной операционной системы ..., opennews (?), 19-Июн-09, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


13. "Первая альфа версия новой микроядерной операционной системы ..."  +/
Сообщение от MaMoHTemail (?), 19-Июн-09, 06:24 
Макросы для вычисления выражений плохо изначально.
Описываю на примере. Вот ваш макрос:
#define imin(x,y) (x < y) ? x : y

Какой будет результат для выражения?:
imin(InX++, InY)

А ведь тот кто пишет код использующий вашу функцию-макрос вполне возможно не посмотрит, что это функция или все таки макрос.

Ответить | Правка | К родителю #7 | Наверх | Cообщить модератору

21. "Первая альфа версия новой микроядерной операционной системы ..."  +/
Сообщение от dq0s4y71 (?), 19-Июн-09, 11:23 
А что насчет этого скажете? :)

#define min(x, y) ({                \
    typeof(x) _min1 = (x);            \
    typeof(y) _min2 = (y);            \
    (void) (&_min1 == &_min2);        \
    _min1 < _min2 ? _min1 : _min2; })

#define max(x, y) ({                \
    typeof(x) _max1 = (x);            \
    typeof(y) _max2 = (y);            \
    (void) (&_max1 == &_max2);        \
    _max1 > _max2 ? _max1 : _max2; })

Ответить | Правка | Наверх | Cообщить модератору

26. "Первая альфа версия новой микроядерной операционной системы ..."  +/
Сообщение от demo (??), 19-Июн-09, 13:14 
>А что насчет этого скажете? :)

Затейливо.
Смысл пассажа "(void) (&_max1 == &_max2);" ускользает :)
gcc 3.4.5 с опцией -O2 в простейшем примере сгенерировал одинаковый код для макроса и inline фунции.

Но мне кажется, что для понимания и написания inline функция проще.

Ответить | Правка | Наверх | Cообщить модератору

29. "Первая альфа"  +/
Сообщение от Andrey Mitrofanov (?), 19-Июн-09, 13:46 
>Затейливо.

Это же наша Родина... Гм, не то. Это же "современный" Си, коллега. Ж)
Короче, они у линукса :) "плохому научились".

>Смысл пассажа "(void) (&_max1 == &_max2);" ускользает :)

Проверка типов аргументов макроса...

>одинаковый код для макроса и inline фунции.

...во время компиляции. Или около того? Читал где-то. Ссылки нет - плохо, что гугль :) по Си-выражениям и/или символам-не-буквоцифрам не ищет.

Возможно, ещё на то, что оба аргумента - lvalue.

Ответить | Правка | Наверх | Cообщить модератору

32. "Первая альфа версия новой микроядерной операционной системы ..."  +/
Сообщение от dq0s4y71 (?), 19-Июн-09, 14:00 
> Смысл пассажа "(void) (&_max1 == &_max2);" ускользает :)

http://mail.nl.linux.org/kernelnewbies/2003-12/msg00007.html

> Но мне кажется, что для понимания и написания inline функция проще.

Для понимания - возможно. Но вам придется писать свою инлайн функцию для каждого сравниваемого типа.

Ответить | Правка | К родителю #26 | Наверх | Cообщить модератору

38. "Первая альфа версия новой микроядерной операционной системы ..."  +/
Сообщение от demo (??), 19-Июн-09, 16:34 
Спасибо за ссылочку.
Ответить | Правка | Наверх | Cообщить модератору

27. "Первая альфа версия новой микроядерной операционной системы ..."  +/
Сообщение от pavlinux (ok), 19-Июн-09, 13:29 
>[оверквотинг удален]
> typeof(x) _min1 = (x);   \
> typeof(y) _min2 = (y);   \
> (void) (&_min1 == &_min2);  \
> _min1 < _min2 ? _min1 : _min2; })
>
>#define max(x, y) ({    \
> typeof(x) _max1 = (x);   \
> typeof(y) _max2 = (y);   \
> (void) (&_max1 == &_max2);  \
>    _max1 > _max2 ? _max1 : _max2; })

Вау, здорово.... расскажи по строчками плиз...

Ответить | Правка | К родителю #21 | Наверх | Cообщить модератору

33. "Первая альфа версия новой микроядерной операционной системы ..."  +/
Сообщение от dq0s4y71 (?), 19-Июн-09, 14:02 
>[оверквотинг удален]
>> (void) (&_min1 == &_min2);  \
>> _min1 < _min2 ? _min1 : _min2; })
>>
>>#define max(x, y) ({    \
>> typeof(x) _max1 = (x);   \
>> typeof(y) _max2 = (y);   \
>> (void) (&_max1 == &_max2);  \
>>    _max1 > _max2 ? _max1 : _max2; })
>
>Вау, здорово.... расскажи по строчками плиз...

http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Statement-Exprs....
http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Typeof.html
http://mail.nl.linux.org/kernelnewbies/2003-12/msg00007.html

Ответить | Правка | Наверх | Cообщить модератору

31. "Первая альфа версия новой микроядерной операционной системы ..."  –1 +/
Сообщение от Vitaly Chernookiyemail (?), 19-Июн-09, 13:58 
а можно обьяснить в чем смысл такого извращения?

я всегда получал удовлетворительный результат следующим образом:

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

Ответить | Правка | К родителю #21 | Наверх | Cообщить модератору

34. "Первая альфа версия новой микроядерной операционной системы ..."  +/
Сообщение от Andrey Mitrofanov (?), 19-Июн-09, 14:23 
>а можно обьяснить в

Нет, нельзя.

Учитесь читать. Учитесь не писать уже написанный вопрос.

>я всегда

Учитесь принимать непознанное и, да - ужас!, учитывать своё незнание.

Успехов в!

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру