Penso che l'estensione GCC __attribute__((cleanup))
sia una buona idea, almeno per alcuni casi, ma non riesco a capire come usarlo in un buon modo. Tutto quello che sto facendo sembra ancora molto fastidioso.Un modo valido e idiomatico per usare GCC e clang __attribute __ ((cleanup) e dichiarazioni puntatore
ho visto un sacco di codice di fare #define _cleanup_(x) __attribute__((cleanup(x))
solo per digitare meno, ma c'è un modo per passare lì una funzione standard come free
o closedir
, fclose
, ecc?
Per come la vedo io non posso solo scrivere:
__attribute__((cleanup(free))) char *foo = malloc(10);
Perché il callback pulizia riceverà char**
puntatore, e ho dovuto scrivere sempre qualcosa di simile:
static void free_char(char **ptr) { free(*ptr); }
__cleanup__((free_char)) char *foo = malloc(10);
Questo è abbastanza fastidioso, e la parte più fastidiosa è definire tali funzioni di pulizia per tutti i tipi di cui hai bisogno, perché ovviamente non puoi semplicemente definirlo per void **
. Qual è il modo migliore per evitare queste cose?
Penso che tu abbia fatto un buon esempio per dire che "__attribute __ ((cleanup))" è ** non ** una buona idea. – user3386109
Se vuoi i distruttori sai dove trovarli. –
@ user3386109, direi che è una buona idea, ma la realizzazione è un po 'rotta. O forse c'è qualcosa che non capisco, ecco perché lo sto chiedendo. – coredump