我有一個關於在C++中使用goto語句的問題。我明白這個話題是有爭議的,並且對任何廣泛的建議或論點都不感興趣(我通常偏離使用goto
)。相反,我有一個特定的情況,並希望瞭解我的解決方案(使用goto語句)是否合適。我不會稱自己爲C++新手,但不會將自己歸類爲專業級程序員。生成我的問題的部分代碼一旦啓動,將以無限循環形式旋轉。在僞線的一般流程如下:使用goto乾淨地退出循環
void ControlLoop::main_loop()
{
InitializeAndCheckHardware(pHardware) //pHardware is a pointer given from outside
//The main loop
while (m_bIsRunning)
{
simulated_time += time_increment; //this will probably be += 0.001 seconds
ReadSensorData();
if (data_is_bad) {
m_bIsRunning = false;
goto loop_end;
}
ApplyFilterToData();
ComputeControllerOutput();
SendOutputToHardware();
ProcessPendingEvents();
while (GetWallClockTime() < simulated_time) {}
if (end_condition_is_satisified) m_bIsRunning = false;
}
loop_end:
DeInitializeHardware(pHardware);
}
的pHardware指針從ControlLoop對象之外傳入,並具有多態類型,所以它並沒有多大意義,我要利用RAII,並在main_loop內創建並破壞硬件接口本身。我想我可以讓PHardware創建一個臨時對象,代表硬件的一種「會話」或「使用」,它可以在main_loop的出口自動清理,但我不確定這個想法是否會讓某人更清楚否則我的意圖是什麼。循環中只會有三種方式:第一種方式是從外部硬件讀取錯誤的數據;第二個是如果ProcessPendingEvents()指示用戶發起的中止,這只是簡單地導致m_bIsRunning成爲假;最後是如果在循環底部滿足結束條件。我也許還應該注意,main_loop可以在ControlLoop對象的整個生命週期中啓動並完成多次,所以它應該在之後以m_bIsRunning = false
乾淨地退出。
另外,我意識到我可以在這裏使用break關鍵字,但main_loop中的大部分僞代碼函數調用並沒有真正封裝爲函數,僅僅是因爲它們需要有很多參數,或者它們都需要訪問成員變量。在我看來,這兩種情況會比將main_loop作爲一個更長的函數更容易混淆,並且由於大while循環的長度,像goto loop_end
這樣的語句似乎更清晰地顯示給我。
現在的問題:如果您要將它寫入自己的代碼,這種解決方案會讓您感覺不舒服嗎?它對我來說確實感覺有點不對,但之後我從未在C++代碼中使用goto語句 - 因此我請求專家幫忙。我還有沒有其他的基本想法可以讓代碼更清晰?
謝謝。
「使用RAII對我來說沒有多大意義」使用RAII總是很有意義。總是。所有的時間。 –
爲什麼不在這裏使用'break'? –
如果只有一個你打破的循環,使用'break';它更清潔和更清晰。如果你有多個循環級別,或者如果你在'switch'中,並且你需要退出所有的循環,那麼'goto'就可以。 –