从 c 或 cpp 系列子函数返回到主函数

Returning back to main function from c or cpp series of sub functions

本文关键字:返回 函数 子函数 系列 cpp      更新时间:2023-10-16

我想知道是否有任何方法可以取消函数的执行并从子函数返回给调用者? 就像在程序集中一样,您可以从堆栈地址进行弹出并进行返回..这样,您可以忽略第一个返回地址到以前的地址。 我很难找到一种方法来停止执行一段代码,当函数中发生一些错误时,这可能是主函数下的三种方式。并返回主。 就像当你的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);
}
}