gpt4 book ai didi

c - 可移植的相当于 gcc 的 __attribute__(cleanup)

转载 作者:太空狗 更新时间:2023-10-29 16:34:24 24 4
gpt4 key购买 nike

最近我遇到了一个 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 上进行圣战......)并且这个例子是人为的,但事实仍然是这可以是非常有用的功能。

不幸的是,据我所知,这是特定于 gcc 的。我对做同样事情的任何便携方式感兴趣(如果它们存在的话)。有没有人有过用 gcc 以外的东西做这件事的经验?

编辑:似乎便携性没有发挥作用。考虑到这一点,有没有办法在 gcc 空间的之外 执行此操作?似乎不错的功能是特定于 gcc 的...

最佳答案

C 中没有可移植的方法。

幸运的是,它是带有析构函数的 C++ 的标准功能。

编辑:

MSVC 似乎有 __try 和 __finally 关键字,它们也可用于此目的。这与 C++ 异常处理不同,我认为它在 C 中可用。

我认为您会发现清理和 try/finally 并没有被广泛使用,特别是因为 C++ 中的隐式支持,它与 C 语言“足够接近”,以至于对这种行为感兴趣的人可以将他们的代码切换到 C++轻松。

关于c - 可移植的相当于 gcc 的 __attribute__(cleanup),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1828550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com