从C中的另一个函数调用主函数
Posted
技术标签:
【中文标题】从C中的另一个函数调用主函数【英文标题】:Calling main function from another function in C 【发布时间】:2014-10-02 13:02:16 【问题描述】:我有一个 main 函数,它在初始化期间运行一些函数,然后运行一个等待来自 UART 的命令的 while 循环。
当我看到一个特定的命令(比如重置)时,我会调用一个返回值的函数。我想做以下事情:
-
保存返回值
使用返回值再次启动主函数。 main函数初始化时需要返回值。
我是 C 语言的新手,我无法找到一种在 main 中保存变量值的方法。
【问题讨论】:
您很可能必须将值写入文件(或非易失性存储器)并重置处理器。当 main 启动时,它可以从这个内存位置读取以获取值。 什么平台?嵌入式演示板?您可以访问外部非易失性存储器吗?你能对微控制器非易失性存储器进行分区吗? 【参考方案1】:理论上这是可能的,但它有点打破范式,重复调用一个函数而不让它完成并返回将很快填满你的调用堆栈,除非你采取措施在编译器背后展开它。
更常见的解决方案是将您的 main() 函数编写为一个巨大的无限 while 1 循环。您可以在内部循环或其他方式中完成所有操作,并设置子句,如果您获得所需的新值,您可以跌至底部并返回,有效地重新运行 以新状态为主。
【讨论】:
不,这是不可能的——标准禁止递归调用main
。
@ikh 这不是真的。试试看,你会看到的。但我承认这样做是不明智,无限的、无补偿的递归会使堆栈崩溃。我们都提出了相同的替代方案。
+1 这是更好的解决方案。您的嵌套循环想法的示例将是一个很好的补充。
@ChrisStratton 哦,对不起……在 C 语言中,这不是被禁止的。我只是感到困惑,因为这是被禁止的,并且会导致 C++ 中未定义的行为。【参考方案2】:
按照我的理解,你基本上有以下设置:
int main(int argc, char *argv[])
int value = something_from_last_reset;
perform_initialization(value);
while(1)
int next_command = wait_for_command();
if(next_command == RESET_COMMAND)
value = get_value();
// somehow restart main() with this new value
return 0;
这是您可以采取的一种方法:
// global
int value = some_initial_value;
void event_loop()
while(1)
int next_command = wait_for_command();
if(next_command == RESET_COMMAND)
value = get_value();
return; // break out of the function call
int main(int argc, char *argv[])
while(1)
perform_initialization(value);
event_loop();
return 0;
这实质上可以让您“逃离”事件循环并重新执行初始化。
【讨论】:
【参考方案3】:只需将您的 main
包装到无限循环中。
int main(void)
int init_val = 0;
while (1)
// your code ...
init_val = some_function();
【讨论】:
OP如何重置处理器(或重启main
)并使用新的init_val
设置系统?
@FiddlingBits 重置处理器是您的想法,而不是问题的一部分。这实际上是标准解决方案。从功能上讲,它与您在演示文稿中的“goto”唯一清洁器相同。
这不是一个解决方案,因为这就是 OP 提到他要做的事情。他需要从头开始重新启动系统。
@FiddlingBits 我不认为问题是如何做到这一点。问题是,当您拥有诸如 while 循环之类的资源以及在函数中分离代码的能力时,为什么会有人想要这样做。当有这么多选择时,OP 显然在这种无意义的方法选择中具有隧道视野。
@FiddlingBits initing、main-code、deiniting 在while(1)
循环中——我肯定评论// your code...
。以上是关于从C中的另一个函数调用主函数的主要内容,如果未能解决你的问题,请参考以下文章