我有一个关于在 C++ 中使用 goto 语句的问题。我知道这个话题是有争议的,并且对任何笼统的建议或论点不感兴趣(我通常不使用goto
)。相反,我有一个特定的情况,想了解我使用 goto 语句的解决方案是否是一个好的解决方案。我不会称自己是 C++ 新手,但也不会将自己归类为专业级程序员。生成我的问题的代码部分一旦开始就会在无限循环中旋转。伪代码中线程的一般流程如下:
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 变为假;最后一个是在循环的底部是否满足结束条件。m_bIsRunning = false
然后。
另外,我意识到我可以在这里使用 break 关键字,但是 main_loop 中的大多数伪代码函数调用并没有真正封装为函数,仅仅是因为它们要么需要有很多参数,要么都需要访问成员变量。在我看来,这两种情况都会比简单地将 main_loop 保留为更长的函数更令人困惑,并且由于大 while 循环的长度,这样的语句goto loop_end
对我来说似乎更清晰。
现在的问题是:如果你用自己的代码编写这个解决方案,会不会让你感到不舒服?我确实觉得有点不对劲,但是我以前从未在 C++ 代码中使用过 goto 语句——因此我请求专家的帮助。还有其他我遗漏的基本想法可以使这段代码更清晰吗?
谢谢。