Goto 可以在不调用析构函数的情况下遍历函数吗?
一个常见的误解是 goto 会跳过代码段,从而避免执行析构函数和类似函数运营。这种误解在围绕 C 的讨论中尤其明显。
范围限制
与普遍看法相反,goto 无法遍历函数边界。尝试跳转到不同函数中定义的标签会导致编译器错误,如下所示:
void f() { int x = 0; goto lol; } int main() { f(); lol: return 0; }
错误:标签“lol”已使用但未定义
对象初始化注意事项
同样不允许跳过对象初始化。如果您尝试跳过对象的初始化,编译器将标记一个错误:
int main() { goto lol; int x = 0; lol: return 0; }
错误:跳转到标签'lol'
错误:从这里
错误:交叉初始化'int x'
特定范围的销毁
对象具有自动存储持续时间的文件在退出其范围时都会被销毁,无论退出方式如何。因此,Goto 无法绕过对象销毁:
struct T { T() { cout << "*T"; } ~T() { cout << "~T"; } }; int main() { { T t; goto lol; } lol: return 0; }
输出:*T~T
对象类型限制
跳入范围时通常禁止使用非标量对象,但具有简单默认构造函数和析构函数的对象存在例外。没有初始化器的数组声明也可以豁免。
结论
Goto 虽然不是规避 C 作用域机制的漏洞,但如果不小心使用,可能会导致不可预见的行为。尽管如此,上述限制提供了防止无意或有害的 goto 使用的保障措施。因此,它并不像人们普遍认为的那样本质上是邪恶的,但应该谨慎使用。
以上是C 中'goto”是否绕过析构函数执行?的详细内容。更多信息请关注PHP中文网其他相关文章!