Reescreva a macro de limpeza do GCC com função aninhada para Clang?
Estou tentando resolver um problema em uma biblioteca de terceiros. O problema é que a biblioteca usa as funções aninhadas do GCC enterradas em uma macro e o Clang não suporta funções aninhadas e não tem planos de fazê-lo (cf.Clang Bug 6378 - erro: classe de armazenamento ilegal na função)
Aqui está a macro que é o ponto de dor para mim e Clang:
#define RAII_VAR(vartype, varname, initval, dtor) \
/* Prototype needed due to http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36774 */ \
auto void _dtor_ ## varname (vartype * v); \
void _dtor_ ## varname (vartype * v) { dtor(*v); } \
vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)
E aqui está como é usado (nos comentários do código):
* void do_stuff(const char *name)
* {
* RAII_VAR(struct mything *, thing, find_mything(name), ao2_cleanup);
* if (!thing) {
* return;
* }
* if (error) {
* return;
* }
* do_stuff_with_thing(thing);
* }
oUsuário Clang Manual declara usar C ++ e uma função lambda para emular. Não sei se essa é a melhor estratégia, e provavelmente um projeto em Cnão aceite um patch C ++ (eles provavelmente me tarão e me encherão de penas).
Existe uma maneira de reescrever a macro para que seja (1) mais flexível para Clang e (2) preserve a semântica da função original?