如何从C编程语言的子函数开始使用主函数?

问题描述:

我正在写一个C代码,这个代码由许多子函数组成,并且在一个子函数中还有另一个子函数,在执行这个子子函数之后,我需要回到主函数的开头。如何从C编程语言的子函数开始使用主函数?

我的问题是我该如何退出此功能并返回主要功能?

由于这段代码太大所以我没有在这里包含这段代码。我认为return;不能做这件事,因为它只返回函数调用的函数。我是C编程的初学者,所以请提出我需要做的事情?

enter image description here

+2

也许构建一个小例子来演示你正在尝试做什么 –

+2

如果是这样的话,你应该用一个循环来启动你的主函数,但是我们不能肯定地说不知道更多并且看到相关代码 –

+1

在结构化编程原理发展60年后,你真的不想这么做。如果您正在从事软件开发工作,那么这可能会严重损害您的职业生涯!学会正确设计和编写代码。 – Clifford

这个答案需要一个健康危害 - 这是错误的方式来编程

您可以使用setjmplongjmp做到这一点。通过思考代码的设计事先

+0

@Prayuktibid:虽然这是完全按照ed所强调的要求的方式,但你真的不希望这样做。我希望埃德甚至担心你已经接受了这个答案。 – Clifford

+0

@Clifford - 这是一个解决方案。但海报确实需要重新思考。我希望海报不接受答案,并会回到图画书 –

+0

**任何机构阅读此答案 - 做这些时,没有其他选项可用** –

Ç维持嵌套函数叠层。如果主程序调用函数1并调用函数2,则只能通过在每个函数中使用return语句(因此从2返回到1,然后返回主)展开堆栈,才能返回主程序。所以我认为你不能做你想做的事。您可以使用exit语句完全终止程序。

使内部函数返回一个值,而不是void -

在你的力量来避免这种做的一切。在中间函数中使用该值来确定是否应该返回到main

int main(void) { 
    f2(); 
    return 0; 
} 

void f2(void) { 
    if (f1()) return; 
    /* ... */ 
} 

int f1(void) { 
    if (condition true) return 1; 
    /* ... */ 
    return 0; 
} 

跨越

函数边界跳跃是违背结构化编程,并且虽然可能(使用的setjmp(),longjmp的())是不合适的,不必要在这种情况下。

您不需要将函数调用视为简单的子例程 - 它们需要参数和返回值;在这种情况下,返回值特别有用于向调用者提供用于控制程序流的信息。

根据你的(有点混乱)图中:

typedef enum tStatus 
{ 
    STATUS_FAIL ; 
    STATUS_SUCCESS ; 
} tStatus; 

void function1(void) ; 
tStatus function2(void) ; 
tStatus function1n(void) ; 

int main() 
{ 
    for(;;) 
    { 
     // statement1 
     // statement2 

     function1() ; 
     if(function2() == STATUS_SUCCESS) 
     { 
      // statement3 
     } 
    } 

    return 0 ; 
} 

void function1(void) 
{ 
    // do something 
} 

tStatus function2(void) 
{ 
    // statement1 
    // statement2 

    tStatus status = function1n() ; 
    if(status == STATUS_SUCCESS) 
    { 
     // statement n 
    } 

    return status ;   
} 

tStatus function1n(void) 
{ 
    tStatus status = STATUS_FAIL ; 

    // statement1 

    if(!condition) 
    { 
     status = STATUS_SUCCESS ; 
     // statement n 
    } 

    return status ; 
} 

如果按照码流,你会看到,当function1n()conditiontrue然后STATUS_FAIL回到function2(),它返回STATUS_FAILmain()这然后使控制流回到main()循环的顶部。

请注意,大多数简单的裸机嵌入式系统不会从main()返回,因此在不使用OS或RTOS时无限循环是正常实现。