gpt4 book ai didi

c - 在 C 中禁用返回

转载 作者:行者123 更新时间:2023-12-05 04:17:17 24 4
gpt4 key购买 nike

我很好奇是否有一种好的方法可以禁止在 C 函数中返回。

这不是我经常想做的事情,但在某些情况下,大型复杂函数不应在特定代码块内返回,我想确保这一点。

通常这是为了确保清理功能运行或状态不会无效。

如果您有很多人在编写代码,进行一些编译器检查会很方便,因为这可能会意外漏掉。

 some_function(void)
{
/* ... code ... */

#define return __noreturn__ /* any unknown identifier */
{ int return; (void)return; } /* avoids gcc's '-Wunused-macros' */

/* ... code which _can't_ return ... */

#undef return

/* ... code which _can_ return ... */

}

这行得通。但相当丑陋,除了快速本地测试外,我不想将其用于任何其他用途。

有什么方法可以设置禁用返回端启用的宏吗? (也许使用一些毒药 _Pragma?,但它也必须能够解毒)。

 some_function(void)
{
/* ... code ... */
RETURN_DISABLE;
/* ... code which _can't_ return ... */
RETURN_ENABLE;
/* ... code which _can_ return ... */

}

注意 1) 我知道在大多数情况下有更好的解决方案,包括重构代码,但我认为在某些情况下这种保证仍然有用。

注意 2) 使用 goto 仍然可以绕过清理代码,但我认为这种情况超出了这个问题的范围。

最佳答案

您正在尝试使用编译器解决一个应该通过代码审查和编码标准来解决的问题。

根据经验,函数不应有多个退出点。这使得它们更难推理,也更难确保清理代码运行(你的问题在这里)。此外,如果函数太大以至于您认为自己可能会错过 return 语句,那么很可能需要将其拆分为更小的函数。

例如你可以有

int some_func(...)
{
init_some_func(...);
err = some_func_work(...)
clean_up_some_func(...);
return err;
}

或类似的东西。现在,工作函数的返回将始终导致清理工作完成。

关于c - 在 C 中禁用返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23796050/

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