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?

questionAnswers(1)

yourAnswerToTheQuestion