从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中的另一个函数调用主函数的主要内容,如果未能解决你的问题,请参考以下文章

c语言中主函数能调用自己吗?

从 VBA (Excel) 中的另一个函数调用一个函数

如何从 Rcpp 中的另一个函数调用一个函数?

从 module.exports 中的另一个函数调用 module.exports 中的“本地”函数?

NodeJS:从同一文件中的另一个函数内部调用函数

如何从Python中的另一个函数调用函数内的函数? [重复]