Skip to content

C言語でGoのdeferを実装する方法

(Un)portable defer in Cでコード例が書かれていた。

#define defer __DEFER(__COUNTER__)
#define __DEFER(N) __DEFER_(N)
#define __DEFER_(N) __DEFER__(__DEFER_FUNCTION_##N, __DEFER_VARIABLE_##N)
#define __DEFER__(F, V) \
auto void F(int*); \
[[gnu::cleanup(F)]] int V; \
auto void F(int*)

なんでこんなに多段な実装になっているのか分からないが、使い方は素朴。

char *p;
p = malloc(sizeof(10));
defer { free(p); }

モダンなCなら cleanup 属性も使える。

__attribute__((cleanup(free))) char *p = malloc(sizeof(10));