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));