Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
The cleanup attribute runs a function when the variable goes out of scope. This attribute can only be applied to auto function scope variables; it may not be applied to parameters or variables with static storage duration. The function must take one parameter, a pointer to a type compatible with the variable. The return value of the function (if any) is ignored.
If -fexceptions is enabled, then cleanup_function is run during the stack unwinding that happens during the processing of the exception. Note that the cleanup attribute does not allow the exception to be caught, only to perform an action. It is undefined what happens if cleanup_function does not return normally.
Мы кастуем void * в void ** а потом разыменовываем. Это чтоб получить значение самого x а не указателя на него
Ну т.е. в функцию void myfree(void *ptr) передается указатель на x. Можно переписать как-нибудь вот так:
В cleanup_function передаётся указатель на переменную с которой надо что-то сделать. Каст в void** тут для того, чтобы разыменовать и получить значение этой переменной.
Смотри, x имеет тип char*, память под массив выделяется маллокой, он возвращает указатель на блок памяти, этот указатель мы записываем в x, в myfree передаётся не само значение x(не сам указатель), а указатель на него (указатель на указатель), т.е. чтобы получить значение x надо извлечь указатель по адресу, который передали в функцию.
https://stackoverflow.com/questions/2053029/how-exactly-does-attribute-constructor-work
Ну т.е. в функцию void myfree(void *ptr) передается указатель на x. Можно переписать как-нибудь вот так:
The function must take one parameter, a pointer to a type compatible with the variable.
Или даже сделать чтоб:
#define MK_ARR(type, name, mallocfunc, freefunc, ...)
Чтоб кастомный аллокатор
Улучшил
Какой ____ )))
Это туда входит?