Я думаю, что расширение GCC __attribute__((cleanup)) - это хорошая идея, по крайней мере для некоторых случаев, но я не могу понять, как используйте его в хорошем смысле. Все, что я делаю, выглядит очень раздражающе.
Я видел много кода, делающих #define _cleanup_(x) __attribute__((cleanup(x)), просто для ввода меньше, но там есть способ передать там стандартную функцию, например free или closedir, fclose и т.д.
Как я вижу, я не могу просто написать:
__attribute__((cleanup(free))) char *foo = malloc(10);
Так как обратный вызов очистки получит char** указатель, и я должен всегда писать что-то вроде:
static void free_char(char **ptr) { free(*ptr); }
__cleanup__((free_char)) char *foo = malloc(10);
Это очень раздражает, и наиболее раздражающей частью является определение таких функций очистки для всех типов, которые вам нужны, потому что, очевидно, вы не можете просто определить его для void **. Каков наилучший способ избежать этих вещей?