if子句内定义auto变量编译报错,寻求更优雅实现方案
在if语句内同时判断指针并定义变量的解决办法
你原来的写法不符合C语法规范,所以会触发Expected ')'编译错误。在C17及更高版本中,有更简洁的方式实现需求,无需嵌套if:
方法1:安全合并判断与变量定义
利用三目运算符先处理MyDataPtr的有效性,再将结果赋值给InfoPtr,最后统一判断InfoPtr是否有效:
if (auto* InfoPtr = MyDataPtr ? MyDataPtr->extractInfo() : nullptr; InfoPtr) { // 这里编写你的业务代码 }
逻辑说明:如果MyDataPtr不为空,就调用extractInfo()赋值给InfoPtr;否则给InfoPtr赋nullptr。后续仅当InfoPtr有效时,才执行内部代码,完全避免嵌套。
方法2:C++17初始化子句拆分写法
如果觉得三目运算符不够直观,也可以将MyDataPtr的有效性检查作为初始化步骤(注意:此写法要求MyDataPtr非空时才能执行后续的extractInfo(),否则会触发未定义行为):
if (MyDataPtr; auto* InfoPtr = MyDataPtr->extractInfo(); InfoPtr) { // 业务代码 }
原写法报错原因
C语法规定,if的条件部分要么是单一表达式,要么是C17新增的「初始化语句 + 条件表达式」格式。你原来的if(MyDataPtr && auto* InfoPtr = MyDataPtr->extractInfo())试图将逻辑表达式与变量定义直接混合,违反语法规则,因此编译器报错。
内容的提问来源于stack exchange,提问作者YAKOVM
相关产品推荐
相关产品推荐

