最近我遇到了一个gcc扩展,我发现它非常有用:__attribute__(cleanup)
基本上,这允许您在退出变量时将一个清除调用分配给局部变量。例如,给定下面的代码段,在调用foo
的任何情况下都必须显式地维护和处理所有内存。
void foo() {
char * buff = ...; /* some memory allocation */
char * buff2 = 0, * buff3 = 0;
if (! buff) {
return;
} else {
buff2 = ...; /* memory allocation */
if (! buff2) {
goto clean_exit;
} else {
/* ... and so on ... */
}
}
clean_exit:
free (buff);
free (buff2);
free (buff3);
}
但是,通过使用可以减少到
#define clean_pchar_scope __attribute__((cleanup(pchar_free)))
void pchar_free (char ** c) { free (*c); }
void foo () {
char * buff clean_pchar_scope = ...; /* some memory allocation */
char * buff2 clean_pchar_scope = 0, * buff3 clean_pchar_scope = 0;
if (! buff)
return;
buff2 = ...; /* memory allocation */
if (! buff2)
return;
/* and so on */
}
现在,所有内存都是在范围的基础上回收的,而无需使用嵌套的if/else或goto结构以及函数的统一内存释放部分。我意识到,在那里可以避免使用goto来实现更嵌套的if/else构造(因此,请不要在goto上进行圣战……),并且示例是人为的,但事实上这仍然是一个非常有用的特性。
不幸的是,据我所知,这是海合会特有的。我对任何能做同样事情的便携式方法感兴趣(如果它们确实存在)。
除了海合会,有没有人有过这样的经历?
编辑:
似乎可移植性不起作用。考虑到这一点,有没有办法在海合会之外做到这一点?这似乎是一个不错的功能,是海合会的具体…
最佳答案
在C语言中没有便携式的方法。
幸运的是,它是具有析构函数的C++的标准特征。
编辑:
msvc似乎有一个try和finally关键字,也可以用于此目的。这与C++异常处理不同,我认为它在C中是可用的。
我认为你会发现清理和尝试/最终没有被广泛地使用,因为在C++中隐含的支持,这是“足够接近”C,人们对行为的兴趣可以轻松地将他们的代码切换到C++。
关于c - 可移植的等效于gcc的__attribute __(cleanup),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1828550/