GCC-Bereinigungsmakro mit verschachtelter Funktion für Clang umschreiben?

Ich versuche, ein Problem in einer Bibliothek eines Drittanbieters zu lösen. Das Problem ist, dass die Bibliothek die in einem Makro eingebetteten verschachtelten Funktionen von GCC verwendet und Clang keine verschachtelten Funktionen unterstützt und dies auch nicht plant (vgl.Clang Bug 6378 - Fehler: Ungültige Speicherklasse für Funktion).

Hier ist das Makro, das den Schmerzpunkt für mich und Clang darstellt:

#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)

Und so wird es verwendet (aus den Code-Kommentaren):

 * 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);
 * }

DasClang User Manual gibt an, C ++ und eine Lambda-Funktion zum Emulieren zu verwenden. Ich bin nicht sicher, ob das die beste Strategie ist, und ein C-Projekt wird wahrscheinlichnicht Akzeptiere einen C ++ Patch (sie würden mich wahrscheinlich zuerst tarieren und mit Federn versehen).

Gibt es eine Möglichkeit, das Makro neu zu schreiben, damit es (1) besser zu Clang passt und (2) die ursprüngliche Funktionssemantik beibehält?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage