【发布时间】:2013-07-13 10:28:13
【问题描述】:
我想知道 C/C++ 中的一般主题。 假设我们正在执行一个调用函数 B() 的函数 A(),我们能否确定在 A() 中对 B() 的调用总是会在调用本身“之后”返回。
在一个更一般的问题中,退出函数的可能性有哪些?
C 关键字是(维基百科):auto、break、case、char、const (C89)、continue、default、do、double、else、enum (C89)、extern、float、for、goto、if、inline (C99)、int、long、register、restrict (C99)、return、short、signed (C89)、sizeof、static、struct、switch、typedef、union、unsigned、void (C89)、volatile (C89)、while、 _Bool (C99)、_Complex (C99)、_Imaginary (C99)。
据我所知,这个话题中有趣的是:
- break/continue :在循环或开关中使用(正如我在尝试后被 GCC 告知的那样),它们无法退出函数。
- goto :标签的范围受函数限制,因此 goto 无法退出函数
- return :可以退出函数但总是返回到调用后的指令。我们对这个很安全。
- exit()/abort() 函数将结束应用程序。我们不会返回调用点,但是..我们根本不会返回。
我认为这是针对 C 语言的。您认为还有另一种方法可以退出函数而不返回调用点吗?
在 C++ 中,异常显然不会返回调用点。他们要么去一个catch块,要么到达调用函数,寻找一个catch块。
据我所知,这将是唯一的情况。
感谢您帮助我 =)
【问题讨论】:
-
你只关心标准C吗?或者你对
setjmp(3)和longjmp(3)感兴趣吗? -
-1没有像 C/C++ 这样的语言 -
@BartekBanachewicz:考虑到他们共同的传统,以及许多较旧的 C 构造在 C++ 中工作的事实,这似乎是一个狡辩。
-
听起来你真正的问题可能集中在“可达性”和/或静态分析/证明关于代码的陈述上。你在写这样的分析工具吗?
-
@CarlNorum:
setjmp和longjmp是标准 C。它们也是标准 C++,但或多或少在该语言中不可用。
标签: c++ c function exception return