从 c 或 cpp 系列子函数返回到主函数
Returning back to main function from c or cpp series of sub functions
我想知道是否有任何方法可以取消函数的执行并从子函数返回给调用者? 就像在程序集中一样,您可以从堆栈地址进行弹出并进行返回..这样,您可以忽略第一个返回地址到以前的地址。 我很难找到一种方法来停止执行一段代码,当函数中发生一些错误时,这可能是主函数下的三种方式。并返回主。 就像当你的linux内核或Windows命令提示符运行一个程序,ctrl-C停止执行并返回到shell一样。
编辑原始问题:
我目前的解决方案如下(不干净(: 我现在使用的是:我有三个宏。我在所有函数的开头使用它们。但这会消耗我的内存、速度和微控制器的闪存
#define STOP_CODE_EXECUTION_MINUS if(StopExecution==1) return -1;
#define STOP_CODE_EXECUTION if(StopExecution==1) return;
#define STOP_CODE_EXECUTION_NULL if(StopExecution==1) return 0;
我选择适合函数类型(void、int 或字符串(的版本。每当我在操作系统中遇到问题时,我都会更改(停止执行(。但是,如果您一直在使用汇编,您就会知道您可以弹出/返回以从堆栈中删除地址并返回到原始调用者(例如 main(。 我一开始的问题是关于这个的。有没有办法使用 c/c++ 代码做同样的事情? 但是,这里的人有编程博士学位,你必须问他们那个级别。 没关系。我只是补充说,让那些真正关心并想帮助感谢的人更清楚。
理论上是的。您可以使用诸如longjmp
.
然而,在实践中,以另一种方式解决问题确实更容易,更好(更不用说C++中的内存安全!(。例如,可以使用异常(C++(或返回错误代码。
然后你会有这样的代码(C 示例(:
int some_failing_function() {
if(failure) { return 1; }
return 0;
}
int some_function() {
if(some_failing_function() == 1) {
return 1; /* return early and let caller know that we failed */
}
/* continue normally */
}
int main() {
if(some_function() == 1) {
fputs("failure!n", stderr);
}
}
更新:如果这对您来说太复杂了,您可以使用例外。出现错误时,throw
异常,以后可以catch
它:
#include <stdexcept>
void some_failing_function() {
if(failure) { throw std::logic_error("something"); }
}
int some_function() {
/* just use a normal function call here */
some_failing_function();
/* continue normally */
}
int main() {
try {
some_function();
} catch(std::exception& e) {
fputs("failure!n", stderr);
}
}
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数