VS2015下C++中如何检测status变量是否曾出现-1
如何检测任意一次status是否为-1
这个问题其实很典型——你每次调用readData32或writeData32后,都直接把结果赋值给了同一个status变量,前面的状态会被后面的覆盖,所以最后只能拿到最后一次的执行结果。要检测任意一次是否返回了-1,有几种实用的解决思路,我给你拆解一下:
方案1:即时检查,失败立即返回
如果只要有一步操作失败,就不需要继续执行后续步骤,那么可以在每次调用后立刻检查status,一旦发现-1就直接返回错误。这样既能及时终止错误流程,也能保证只要返回-1,就说明至少有一步失败了。
修改后的代码如下:
int function1(ATF *cm33) { int status; uint32_t val; // 第一次读取操作,检查状态 status = cm33->readData32(SAU_CTRL_Mv8, &val); if (status == -1) { return -1; // 第一次读取失败,直接返回错误 } // 写入操作,检查状态 status = cm33->writeData32(SAU_CTRL_Mv8, 0x3); if (status == -1) { return -1; // 写入失败,直接返回错误 } // 第二次读取操作,返回最终状态 status = cm33->readData32(SAU_CTRL_Mv8, &val); return status; }
方案2:执行完所有操作,记录是否出现过错误
如果你需要执行完所有操作,同时想知道整个流程中是否有任意一步失败,可以额外加一个标志变量来记录错误状态。即使后续操作成功,只要之前有过失败,最终还是返回-1。
示例代码:
int function1(ATF *cm33) { int status; uint32_t val; bool has_failed = false; // 标记是否有任意一步失败 // 第一次读取 status = cm33->readData32(SAU_CTRL_Mv8, &val); if (status == -1) { has_failed = true; // 可选:在这里添加日志,记录具体是哪一步失败了 // printf("第一次读取SAU_CTRL_Mv8失败\n"); } // 写入操作 status = cm33->writeData32(SAU_CTRL_Mv8, 0x3); if (status == -1) { has_failed = true; // printf("写入SAU_CTRL_Mv8失败\n"); } // 第二次读取 status = cm33->readData32(SAU_CTRL_Mv8, &val); if (status == -1) { has_failed = true; // printf("第二次读取SAU_CTRL_Mv8失败\n"); } // 只要有一次失败就返回-1,否则返回最后一次的状态 return has_failed ? -1 : status; }
方案3:记录具体失败步骤(可选)
如果需要更精确地知道是哪一步操作失败了,可以用一个变量记录失败的步骤编号,后续可以根据这个编号排查问题。示例如下:
int function1(ATF *cm33) { int status; uint32_t val; int error_step = 0; // 0=无错误,1=第一次读失败,2=写失败,3=第二次读失败 status = cm33->readData32(SAU_CTRL_Mv8, &val); if (status == -1) { error_step = 1; } // 只有前一步无错误才继续执行后续操作 if (error_step == 0) { status = cm33->writeData32(SAU_CTRL_Mv8, 0x3); if (status == -1) { error_step = 2; } } if (error_step == 0) { status = cm33->readData32(SAU_CTRL_Mv8, &val); if (status == -1) { error_step = 3; } } // 有错误则返回-1,否则返回最后一次状态 // 如果需要传递具体错误步骤,可以改用输出参数或者修改函数返回类型 return error_step != 0 ? -1 : status; }
这些方案都能解决你当前的问题,你可以根据实际需求选择最适合的方式——比如如果失败后不需要继续操作,方案1最简洁;如果必须执行完所有步骤,方案2更合适;需要排查具体错误点的话,方案3会更实用。
内容的提问来源于stack exchange,提问作者Wassim Hammami
相关产品推荐
相关产品推荐

