我遇到了同样的问题,在搜索时我来到了这个话题。
我刚刚找到了一个解决方案并想在此处发布:如果您在 XML 中将一个函数定义为 Intrinsic,那么编译器不会像This expression has side effects...
您调用该内部函数时那样显示任何内容。
这是一个例子:
我写了一个自定义字符串类,它是这样的:
namespace rkstl
{
namespace strings
{
//null-terminated string object consisting of 'char' elements
class string
{
public:
//... c'tors, copy c'tor and d'tor come here
length(); //returns the length of null-terminated string: _mSize
capacity(); //returns the length of the actual buffer: _mCap
clear();
//... other member functions
private:
char* _pStr; //the actual buffer
size_t _mSize; //length of the string
size_t _mCap; //length of the actual buffer
};
//null-terminated wide string object consisting of 'wchar_t' elements
class wstring
{
//...
};
}
}
你可以从我的实现中看出length()
和capacity()
是内在函数。因此,如果我直接在 .XML 中调用它们,那么编译器将显示This expression has side effects...
,因此我必须单击重新评估按钮(蓝色圆圈箭头)以查看数据是什么:
<Type Name="rkstl::strings::string">
<DisplayString>{_pStr,na}</DisplayString>
<StringView>_pStr,na</StringView>
<Expand>
<Item Name="[string length]" ExcludeView="simple">length()</Item>
<Item Name="[buffer capacity]" ExcludeView="simple">capacity()</Item>
<ArrayItems>
<Size>_pEnd - _pBegin</Size>
<ValuePointer>_pStr</ValuePointer>
</ArrayItems>
</Expand>
相反,我定义了评估与类中相同事物的内在函数。我可以直接在 .natvis XML 中调用它们。这是我的 .natvis 实现rkstl::strings::string
:
<Type Name="rkstl::strings::string">
<Intrinsic Name="length_dbg" Expression="(_mSize)"/>
<Intrinsic Name="capacity_dbg" Expression="(_mCap)"/>
<DisplayString>{_pStr,na}</DisplayString>
<StringView>_pStr,na</StringView>
<Expand>
<Item Name="[length of the string]" ExcludeView="simple">length_dbg()</Item>
<Item Name="[capacity of the buffer]" ExcludeView="simple">capacity_dbg()</Item>
<ArrayItems>
<Size>_pEnd - _pBegin</Size>
<ValuePointer>_pStr</ValuePointer>
</ArrayItems>
</Expand>
您可以看到我已将length_dbg()
和定义capacity_dbg()
为 Intrinsic。因此,调试器可以安全地调用它们并评估我想要显示的数据。结果如下: