LINUX.ORG.RU

Обновилась библиотека uthash

 ,


3

5

Собственно, в обновлении пофиксили баг с xxx_INORDER функциями. Если вы их у себя в коде их не использовали - не стоит беспокоиться, код не рухнет. Но на будущее обновиться имеет смысл.

Код библиотеки uthash на гитхабе:
https://github.com/troydhanson/uthash

Для новости это сильно мало, но библиотека в мире C популярная, поэтому на всякий случай пишу в Development.

★★★★★
Ответ на: комментарий от anonymous

Т.к. примера макроса вероятно не будет, то вот как обычно это делается в С:

#define MAX( A, B ) ( (A) > (B) ? (A) : (B) )
#define MAX3( A, B, C ) MAX( MAX( (A), (B) ), (C) )
#define MAX4( A, B, C, D ) MAX2( MAX2( (A), (B) ), MAX2( (C), (D) ) )
#define MAX5( A, B, C, D, E ) MAX2( MAX3( (A), (B), (C) ), MAX2( (D), (E) ) )
...

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

anonymous
()
Ответ на: комментарий от Iron_Bug

этот коммит фиксит баг с segfault.

Но ведь Ъ-программеры на Си пишут без сегфолтов.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

С ходу нашкарябал такое:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define MAX(A, ...) ({ __typeof__ ((A)) __max = (A); \
        __typeof__ ((A)) __tail[] = { __VA_ARGS__ }; \
        size_t __i; \
        for (__i = 0; __i < sizeof(__tail)/sizeof(__tail[0]); __i++) { \
            if (__tail[__i] > __max) __max = __tail[__i]; \
        }; \
        __max; })


int main(int argc, const char *argv[])
{
    printf("MAX(1,2,3) = %d\n", MAX(1,2,3));
    assert(argc == 4);
    printf("MAX(argv[1,2,3]) = %d\n", MAX(atoi(argv[1]), atoi(argv[2]), atoi(argv[3])));
    return 0;
}

MAX(1,2,3) инлайнится. Типобезопасности особой нету.

deadskif
()
Ответ на: комментарий от deadskif

С ходу нашкарябал такое:

За хороший пример спасибо, но это же не С; я сам «игрался» с расширениями GCC, но использовать остерегаюсь, чтоб не ломать переносимость.

anonymous
()
Ответ на: комментарий от Iron_Bug

Прихуел от такой зашоренности.

anonymous
()
Ответ на: комментарий от Iron_Bug

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

Ну-ну! Haskell не выучишь даже за месяц. Каша в голове только будет, о которой в лучшем случае никто не узнает, но не все так строги к себе, особенно здесь на ЛОРе ;)

dave ★★★★★
()
Ответ на: комментарий от dave

да, есть ещё brainfuck. но его тоже не используют в серьёзном программировании

но не беспокойся. я не извращенец и подобными языками никогда в жизни заниматься не стану.

Iron_Bug ★★★★★
() автор топика
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

но его тоже не используют в серьёзном программировании

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

И его используют в серьезном продакшне еще как.

Freyr69 ★★★
()
Ответ на: комментарий от mix_mix

блин, при чём тут дизайн? ничего он не «высирает» и не «забивает». код там элементарный. там была просто обычная ошибка в коде. я её нашла и написала багрепорт. её исправили. всё. не надо никаких конспирологических версий.

Iron_Bug ★★★★★
() автор топика
Последнее исправление: Iron_Bug (всего исправлений: 2)
Ответ на: комментарий от mix_mix

В целом ты прав, ничего не мешало засунуть всё это в static inline функцию, чтобы компилятор сам решал, подставлять её или нет. А в макрос поместить вызов функции.

Deleted
()
Ответ на: комментарий от Deleted

inline

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

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

Iron_Bug ★★★★★
() автор топика
Последнее исправление: Iron_Bug (всего исправлений: 2)
Ответ на: комментарий от Deleted

да, и все микроконтроллеры и многое другое тоже выкинуть?

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

elegant — The only use case is making me feel smart.

это именно то самое. дешёвый выпенрёж ради непонятно чего вместо нормально работающего универсального решения.

Iron_Bug ★★★★★
() автор топика
Ответ на: комментарий от Iron_Bug

да, и все микроконтроллеры и многое другое тоже выкинуть?

Вам напомнить, сколько лет прошло с публикации ISO/IEC 9899? Может еще на коболе прикажете писать актуальный код?

дешёвый выпенрёж ради непонятно чего вместо нормально работающего универсального решения.

Если кому-то так позарез нужна сборка на компиляторе без поддержки inline, вопрос элементарно решается:

#define MY_SUPER_COOL_CODE_IMPL(a, b, c) do { ... } while(0)

#ifdef USE_INLINE
static inline void my_super_cool_code(int a, int b, int c)
{
    MY_SUPER_COOL_CODE_IMPL(a, b, c);
}
#else
#define my_super_cool_code(a, b, c) MY_SUPER_COOL_CODE_IMPL(a, b, c)
#endif

Но для вас же главное — дешёвый выпенрёж на ЛОРе ради непонятно чего.

Deleted
()

ТС в этом треде удивительно напоминает Царя, с поправкой на то, что оный персонаж предпочитает делать упор на оскорблении оппонентов, а ТС уничижительно отзываться об инструментах, которыми те пользуются.

Очевидный диагноз: паталогический Си ЧСВ.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Iron_Bug

но не беспокойся. я не извращенец и подобными языками никогда в жизни заниматься не стану.

Iron_Bug ★★ (18.01.2017 19:44:01) высокомерная тетка

dave ★★★★★
()
Ответ на: комментарий от Deleted

uhtash - библиотека, которая широко используется уже много лет. и никакие хипстерские «улучшения» (которые на самом деле абсолютно ничего не улучшают, кроме чьего-то ЧСВ) ей не нужны. там всё сделано очень просто. и макросы разворачиваются в код совершенно однозначно. там нечего «улучшать». а читабельность для нубов - это не улучшение. и уж точно не надо в пользу этого школоло портить портируемость кода.

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

Iron_Bug ★★★★★
() автор топика
Ответ на: комментарий от dave

не менее высокомерная, чем ты с каким-то языком, на котором за 27 лет написали полтора полезных приложения. так что всё соизмеримо, ага.

Iron_Bug ★★★★★
() автор топика
Ответ на: комментарий от Virtuos86

а вы не лезьте со своим дешёвым пиаром и школярскими поучениями в тему с тегом «С». всё просто.

это тема про конкретную библиотеку. она написана на С. точка.

Iron_Bug ★★★★★
() автор топика
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

uhtash - библиотека, которая широко используется уже много лет. и никакие хипстерские «улучшения» (которые на самом деле абсолютно ничего не улучшают, кроме чьего-то ЧСВ) ей не нужны. там всё сделано очень просто. и макросы разворачиваются в код совершенно однозначно. там нечего «улучшать». а читабельность для нубов - это не улучшение. и уж точно не надо в пользу этого школоло портить портируемость кода.

Радуешь, прям канонически:

lightweight — I don’t understand the use-cases the alternatives solve.

minimal — You’re going to have to write more code than I did to make it useful.

------------------------

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

Опять пошло ко-ко-ко про нубов и анскилед. Ты даже не поняла, о чем писал комментатор, с которым я согласился:

на каждый чих препроцессор высирает кучу кода (как, например, здесь), что забивает L1i

Deleted
()
Ответ на: комментарий от Iron_Bug

там была просто обычная ошибка в коде. я её нашла и написала багрепорт. её исправили.

Не очень понятно что эта тема делает в dev? Она должна быть в talks без таких тегов и называться как-то: «Я нашла ошибку в библиотеке на гитхабе и ее исправили. Это победа!»

BRE ★★
()
Ответ на: комментарий от Deleted

А всё почему? Правильно, удобнее и компактнее чем на си заниматься байто**ством у тебя не получится практически нигде. Плюсы оверхеднуты по сложности(не берём embedded случай где от плюсов остаются классы и темплейты), раст несколько упорот и арифметика указателей там требует больше телодвижений.

Другое дело, что раст бьёт по рукам постоянно, а плюсы и няшная сишечка нет, что требует большей дисциплины программиста.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от makoven

Убийц крестов в год пучок появляется. Начиная хотя бы с жавы и заканчивай каким-нибудь Go.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT

Это всё правильно, но

байто**ством

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

Собственно, я такой язык на коленке попиливаю как хобби: с уровнем абстракций не выше си, но с удобными тьюринг-полными макросами.

Deleted
()
Ответ на: комментарий от BRE

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

Iron_Bug ★★★★★
() автор топика
Ответ на: комментарий от Deleted

понимаешь ли, фантазии на тему «что-то засирает» не в тему. там нет никакой рекурсии и и.д. линейные макросы. тут что-то непонятно? что там у кого переполнилось от непонимания обычных макросов - это его проблемы.

и твои «оптимизации» насчёт инлайна не нужны. потому что макрос развернётся в инлайн стопроцентно. а вот твой инлайн - вовсе не факт. это не облигаторное свойство, а просто рекомендация компилятору. он может на неё забить. так что это «улучшение» ничего не улучшает, а, вероятно, ещё и ухудшает производительность. немного, но всё же ухудшает. а если учитывать, что хэш-таблицы обычно строятся для очень длинных списков в миллионы итераций, то замедление цикла обработки явно ничего не улучшит. так что прежде чем пытаться вставлять стильно-модно-молодёжные конструкции в код, надо сначала понять, а надо ли это делать.

Iron_Bug ★★★★★
() автор топика
Ответ на: комментарий от Iron_Bug

Как правило, задача стоит - «развернуться» не «стопроцентно», а лишь там, где это оправдано.

Если оптимизируем по размеру - вызов функции предпочтительнее.

Если «удалить элемент их хэш-таблицы» вызывается из 20 мест в коде - вызов предпочтительнее.

static inline позволяет компилятору принять решение. А макросы - нет.

Боже, я базовые вещи объясняю «системному программисту с 20-тилетнем стажем». Лицо опухло от фейспальмов.

Deleted
()
Ответ на: комментарий от Deleted

ещё раз: макросы там не рекуррентные. разворачивается всё в минимальный код. меньше там не написать. какие проблемы? компилятор не должен тут ничего принимать. он должен скомпилировать элементарный код.

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

Iron_Bug ★★★★★
() автор топика
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

стильно-модно-молодёжные конструкции

«Когда я училась на первом курсе нам препод про inline не рассказывал.» Молодежные конструкции уже старше половины посетителей этого сайта.

Вообще, уровень зашоренности запредельный. Даже по меркам ЛОРа. Макросы cpp у нас стали высшим достижением цивилизации. Я конечно, тоже люблю навернуть что-то безумное, типа

FOR_EACH_ITEM(iterator, collection, {
    три страницы кода
})
или
#include <sde-utils-x11/atoms.h>
#include <sde-utils.h>

static int atoms_resolved = False;

#define A(x) Atom a##x = 0;
#include <sde-utils-x11/atom_names.h>
#undef A

enum {
    #define A(x) I##x,
    #include <sde-utils-x11/atom_names.h>
    #undef A
    N_ATOMS
};

void su_x11_resolve_well_known_atoms(Display * display)
{
    if (atoms_resolved)
        return;

    atoms_resolved = True;

    static const char * atom_names[ N_ATOMS ] = {
        #define A(x) #x,
        #include <sde-utils-x11/atom_names.h>
        #undef A
    };

    Atom atoms[ N_ATOMS ];

#ifndef DEBUG
    if( !  XInternAtoms(display, (char**)atom_names,
            N_ATOMS, False, atoms ) )
    {
        su_log_error("Error: unable to return Atoms");
        return;
    }
#else
    int i;
    for (i = 0; i < N_ATOMS; i++) {
        su_log_debug("Registering atom %s\n", atom_names[i]);
        if( !  XInternAtoms(display, ((char**)atom_names) + i,
               1, False, atoms + i) )
        {
            su_log_error("Error: unable to return Atoms");
            return;
        }
    }
#endif

    #define A(x) a##x = atoms[ I##x ];
    #include <sde-utils-x11/atom_names.h>
    #undef A
}

Но у меня вроде хватало мозгов не поклоняться богу #define и пророку его #include.

Deleted
()
Ответ на: комментарий от Deleted

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

Iron_Bug ★★★★★
() автор топика

Обожаю эту либу. Один сплошной макрос и бесконечные вопли сишников о том, что шаблоны/дженерики не нужны.

RazrFalcon ★★★★★
()
Ответ на: комментарий от Iron_Bug

ко-ко-ко, я ниасилила стандарты и ман по компилятору, ко-ко-ко

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

Deleted
()
Ответ на: комментарий от Dark_SavanT

что требует большей дисциплины программиста.

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

RazrFalcon ★★★★★
()
Ответ на: комментарий от i-rinat

В микробенчмарках не проявляется, так что всё хорошо.

А если будет что-то типа:

while (перебираем много чего-то)
{
    if (того)
        операция_с_таблицей(таблица1);
    else if (сего)
        операция_с_таблицей(таблица2);
    else
        операция_с_таблицей(таблица3);
}
?

Deleted
()
Ответ на: комментарий от RazrFalcon

не вижу «воплей сишников». вижу только набежавших троллей, которые пиарят что попало, зачем-то, в теме с тегом «C». сишников всё устраивает, у них нет проблем с пониманием макросов.

Iron_Bug ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

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

Рано еще говорить, главный флагман Rust servo все такое же падучее говно, а язык за следующие лет 10-15 еще может успеть обрасти фичами и стать таким же монстром как и плюсы, которые изначально были С с классами.

anonymous
()
Ответ на: комментарий от anonymous

Аналитика уровня ЛОР. На гитхабе куча проектов на расте, которые собираются и не падают. Этим он уже далеко впереди C/C++.

RazrFalcon ★★★★★
()
Ответ на: комментарий от Deleted

это просто твои фантазии. ты живёшь в каком-то вымышленном мире и что-то там про меня сочиняешь то ли для самоуспокоения, то ли просто от нечего делать.

Iron_Bug ★★★★★
() автор топика
Ответ на: комментарий от Iron_Bug

О, либастрал подключился. Продолжайте наблюдения.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.