我正在寫一個C代碼,這個代碼由許多子函數組成,並且在一個子函數中還有另一個子函數,在執行這個子子函數之後,我需要回到主函數的開頭。如何從C編程語言的子函數開始使用主函數?
我的問題是我該如何退出此功能並返回主要功能?
由於這段代碼太大所以我沒有在這裏包含這段代碼。我認爲return;
不能做這件事,因爲它只返回函數調用的函數。我是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