Natvis Intrinsic函数是否支持递归求值?递归幂运算报错咨询
Natvis中整数幂运算递归实现的问题
问题描述
需要在Natvis可视化工具中实现整数幂运算(val^exp),尝试使用递归方式编写<Intrinsic>函数,代码如下:
<?xml version="1.0" encoding="utf-8"?> <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> <Type Name="foobar"> <Intrinsic Name="pow" Expression="exp == 0 ? 1 : val * pow(val, exp - 1)"> <Parameter Name="val" Type="int"/> <Parameter Name="exp" Type="int"/> </Intrinsic> <DisplayString>pow(2, 4) = {pow(2, 4)}</DisplayString> </Type> </AutoVisualizer>
运行后出现Natvis错误:
Natvis: a.natvis (from <path>\a.pdb): Error: identifier "pow" is undefined Error while evaluating 'exp == 0 ? 1 : val * pow(val, exp - 1)' in the context of type 'a.exe!foobar'.
推测是因为无法在<Intrinsic>完全定义前引用它,进而怀疑Natvis不支持递归。
解答
你的诊断是正确的,Natvis的<Intrinsic>元素不支持递归调用自身。
错误提示中的"identifier 'pow' is undefined"正是因为调试器解析<Intrinsic>的表达式时,该函数还未完成注册:Natvis对<Intrinsic>采用自上而下的顺序解析逻辑,当处理到表达式内的pow(val, exp - 1)时,当前的pow Intrinsic还未被添加到调试器的可用函数列表中,因此会被判定为未定义标识符。
如果需要实现整数幂运算,只能使用非递归的表达式编写Intrinsic。例如,可以针对常见指数场景用条件表达式组合,或者实现快速幂的非递归逻辑(受限于Natvis表达式不支持循环,需用嵌套条件覆盖逻辑):
<?xml version="1.0" encoding="utf-8"?> <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> <Type Name="foobar"> <Intrinsic Name="pow" Expression="exp == 0 ? 1 : (exp % 2 == 1 ? val : 1) * (exp >= 2 ? (val*val) : 1) * (exp >=4 ? (val*val*val*val) :1) * (exp >=8 ? (val*val*val*val*val*val*val*val) :1)" > <Parameter Name="val" Type="int"/> <Parameter Name="exp" Type="int"/> </Intrinsic> <DisplayString>pow(2, 4) = {pow(2, 4)}</DisplayString> </Type> </AutoVisualizer>
上述示例通过展开快速幂的部分逻辑,实现了对2的整数次幂以内的指数计算,可根据需求扩展更多层级。
内容的提问来源于stack exchange,提问作者IInspectable
相关产品推荐
相关产品推荐

