Переписать макрос очистки 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) сохранял исходную семантику функции?