如何从C编程语言的子函数开始使用主函数?
问题描述:
我正在写一个C代码,这个代码由许多子函数组成,并且在一个子函数中还有另一个子函数,在执行这个子子函数之后,我需要回到主函数的开头。如何从C编程语言的子函数开始使用主函数?
我的问题是我该如何退出此功能并返回主要功能?
由于这段代码太大所以我没有在这里包含这段代码。我认为return;
不能做这件事,因为它只返回函数调用的函数。我是C编程的初学者,所以请提出我需要做的事情?
答
Ç维持嵌套函数叠层。如果主程序调用函数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()
condition
是true
然后STATUS_FAIL
回到function2()
,它返回STATUS_FAIL
到main()
这然后使控制流回到main()
循环的顶部。
请注意,大多数简单的裸机嵌入式系统不会从main()
返回,因此在不使用OS或RTOS时无限循环是正常实现。
也许构建一个小例子来演示你正在尝试做什么 –
如果是这样的话,你应该用一个循环来启动你的主函数,但是我们不能肯定地说不知道更多并且看到相关代码 –
在结构化编程原理发展60年后,你真的不想这么做。如果您正在从事软件开发工作,那么这可能会严重损害您的职业生涯!学会正确设计和编写代码。 – Clifford