Переписать макрос очистки GCC с помощью вложенной функции для Clang?

Я пытаюсь решить проблему со сторонней библиотекой. Проблема в том, что библиотека использует вложенные функции GCC, скрытые в макросе, и Clang не поддерживает вложенные функции и не планирует этого делать (ср.,Ошибка Clang 6378 - ошибка: недопустимый класс хранения для функции).

Вот макрос, который является болевым пунктом для меня и 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)

А вот как это используется (из комментариев кода):

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

Clang User ManuaЯ заявляю, чтобы использовать C ++ и лямбда-функцию для эмуляции. Я не уверен, что это лучшая стратегия, и проект C, скорее всего,не принять патч C ++ (они, вероятно, сначала смолят меня).

Есть ли способ переписать макрос так, чтобы он (1) был более приспособлен к Clang, и (2) сохранял исходную семантику функции?

Ответы на вопрос(1)

Ваш ответ на вопрос