1
考慮下面的源代碼:Can _Generic是一個函數嗎?或者_Generic可以與__attribute __((cleanup))一起使用?
#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的,但是我想擴展它,並處理多種類型資源的自動清理。