Я думаю, что расширение 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 **
. Каков наилучший способ избежать этих вещей?