最近我遇到了一个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/

10-11 00:02