【发布时间】:2014-12-24 15:33:44
【问题描述】:
给定以下源代码:
#include <stddef.h>
#include <sys/types.h>
#include <dirent.h>
static inline void closedirp(DIR **p) {
if (*p)
closedir(*p);
}
#define auto_cleanup(resource) _Generic((resource), \
DIR **: closedirp, \
)(resource)
int main() {
#ifdef GENERIC
__attribute__((cleanup(auto_cleanup))) DIR * t2 = NULL;
t2 = opendir("/tmp");
#else
__attribute__((cleanup(closedirp))) DIR * t1 = NULL;
t1 = opendir("/tmp");
#endif
}
它编译和运行没有泄漏,没有定义。但是,当定义 GENERIC 时,编译失败:
$ gcc foo.c -DGENERIC
foo.c: In function ‘main’:
foo.c:16:2: error: cleanup argument not a function
__attribute__((cleanup(auto_cleanup))) DIR * t2 = NULL;
^
这是对 _Generic 的毫无意义的使用,但是我想扩展它并处理多种类型的资源以自动清理。
【问题讨论】: