サードパーティのライブラリの問題を解決しようとしています。問題は、ライブラリがマクロに埋め込まれた GCC のネストされた関数を使用しており、Clang がネストされた関数をサポートしておらず、サポートする予定がないことです (参照: Clang Bug 6378 - error: illegal storage class on function )。
これが私と 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 Manualには、C++ とラムダ関数を使用してエミュレートすることが記載されています。それが最善の戦略であるかどうかはわかりません.CプロジェクトはC++パッチを受け入れない可能性があります.
(1) Clang により適応し、(2) 元の関数セマンティクスを保持するようにマクロを書き直す方法はありますか?