【发布时间】:2016-04-07 02:36:06
【问题描述】:
我认为 GCC 扩展 __attribute__((cleanup)) 是一个好主意,至少在某些情况下是这样,但我不知道如何以一种好的方式使用它。我所做的一切看起来仍然很烦人。
我看到很多代码在做#define _cleanup_(x) __attribute__((cleanup(x)) 只是为了减少输入,但它有办法传递一个标准函数,如free 或closedir、fclose 等?
正如我所见,我不能只写:
__attribute__((cleanup(free))) char *foo = malloc(10);
因为清理回调会收到char** 指针,而我必须总是写这样的东西:
static void free_char(char **ptr) { free(*ptr); }
__cleanup__((free_char)) char *foo = malloc(10);
这很烦人,最烦人的部分是为您需要的所有类型定义此类清理函数,因为显然您不能只为void ** 定义它。避免这些事情的最佳方法是什么?
【问题讨论】:
-
我认为你说
__attribute__((cleanup))不是是一个好主意是一个很好的理由。 -
如果你想要析构函数,你知道在哪里可以找到它们。
-
@user3386109,我会说这是个好主意,但实现有点破。或者可能有一些我不明白的东西,所以这就是我问的原因。
-
@coredump 实现也很好。清理函数需要一个指向变量的 pointer 是有道理的,因为变量可能不是指针本身,而是一个最好不要按值传递的大型结构(参见 glib 的
g_autoptr之间的区别和g_auto)。仅仅为了方便而拥有两个不同的属性会使语言扩展不必要地膨胀。 -
@RossRidge:控制它比担心 C++ 带来的包袱要好。所以是的,如果我们想要合理的、好的、非隐藏的析构函数,我们知道在哪里可以找到它们:gcc 和 clang 下的 C 代码。