> Потом были врапперы:
> mem_set(void *buf, const size_t size, const uint8_t c);
> #define mem_bzero(__buf, __size) mem_set((__buf), (size_t)(__size), 0x00)
> #define zalloc(__size) calloc(1, (size_t)(__size))
> #define zallocarray(__nmemb, __size) calloc((__nmemb), (size_t)(__size))
> #define mem_new(__type) (__type*)malloc(sizeof(__type))
> #define mem_znew(__type) (__type*)zalloc(sizeof(__type))
> #define mallocarray(__nmemb, __size) reallocarray(NULL, (__nmemb), (size_t)(__size))
> Удобно же?
> Удобно, и идеологически правильно, и ваще офигенско!По какой идеологии правильно? Такое г-но ещё Ален И. Голуб расчихвостил в своё время, но народ всё так и ходит по граблям макросов https://bugzilla.altlinux.org/show_bug.cgi?id=38212#c2 священная корова же, трогать нельзя!
reallocarray это тоже макрос?
> А что делают в крестах?
Там отчасти решают проблемы вон того непотребства, в том числе и с ошибками из-за приведения типов. inline в Си откуда заимствовано?
> Там исправляют старые ошибки, при сохранении совместимости, а это значит что радом
> со старым кодом/функциями появляются новые.
> И как итог чтобы читать код надо знать все диалекты, начиная от
> самого старого и заканчивая самым новым.
> И всё это для того чтобы в итоге получить тот же самый
> машинный код который выходит из под С компилятора.
Вопрос в том, какой ценой выходит код. Ну и -- если кто-то увидел в Си макросы и принялся их абузить, то в Си++ с этим хуже, да -- там возможностей для таких "рационализаций" гораздо больше.