这两段代码不完全等价,但功能相同。主要的区别在于错误处理的部分。代码段 1 使用了 goto 语句来跳转到错误处理的标签 'REPARAM',而代码段 2 使用了 return 语句来直接返回。此外,代码段 2 在获取 VirtualTouchScreen 实例后进行了判断,避免了在 GetInstance() 返回空指针时引发的程序崩溃。

代码段 1,如下:

void VirtualTouchScreenBuilder::ReadDownAction(int argc, char *argv[])
{
CALL_DEBUG_ENTER;
int32_t slot = -1;
int32_t x = slot;
int32_t y = slot;
auto vTouch = VirtualTouchScreen::GetInstance();
CHKPV(vTouch);
CHKPV(optarg);
if (!Utility::IsInteger(optarg) || (optind + 1 >= argc) || !Utility::IsInteger(argv[optind]) ||
!Utility::IsInteger(argv[optind + 1])) {
std::cout << "Require arguments for Option '-d'." << std::endl;
ShowUsage();
goto REPARAM;
}
slot = std::atoi(optarg);
x = std::atoi(argv[optind]);
y = std::atoi(argv[optind + 1]);
std::cout << "[touchscreen] press: [" << slot << ", (" << x << "," << y << ")]" << std::endl;
vTouch->DownButton(slot, x, y);

REPARAM:
while ((optind < argc) && Utility::IsInteger(argv[optind])) {
optind++;
}
}

代码段 2,如下:

void VirtualTouchScreenBuilder::ReadDownAction(int argc, char *argv[])
{
CALL_DEBUG_ENTER;
int32_t slot = -1;
int32_t x = slot;
int32_t y = slot;
auto vTouch = VirtualTouchScreen::GetInstance();

if (!vTouch) {
std::cout << "GetInstance() failed in ReadDownAction()." << std::endl;
return;
}

if (!Utility::IsInteger(optarg) || (optind + 1 >= argc) || !Utility::IsInteger(argv[optind]) ||
!Utility::IsInteger(argv[optind + 1])) {
std::cout << "Require arguments for Option '-d'." << std::endl;
ShowUsage();
return;
}

slot = std::atoi(optarg);
x = std::atoi(argv[optind]);
y = std::atoi(argv[optind + 1]);
std::cout << "[touchscreen] press: [" << slot << ", (" << x << "," << y << ")]" << std::endl;
vTouch->DownButton(slot, x, y);

while ((optind < argc) && Utility::IsInteger(argv[optind])) {
optind++;
}
}

总的来说,代码段 2 使用 return 语句来进行错误处理更加清晰、易于理解,并且避免了 goto 语句可能带来的代码复杂性和难以调试的问题。此外,代码段 2 对 VirtualTouchScreen 实例进行了判断,避免了程序崩溃,提高了代码的安全性。

C++ 代码比较:使用 goto 语句 vs return 语句的错误处理

原文地址: https://www.cveoy.top/t/topic/nNH3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录