在natvis文件中使用宏?

时间:2014-09-18 16:57:40

标签: c++ macros visual-studio-2013 natvis

我刚学习了Visual Studio中的.natvis文件,并且我已经为我的Ruby C ++ Extension项目设置了一些文件。 http://msdn.microsoft.com/en-us/library/jj620914.aspx

然而,我尝试在条件语句中使用其中一个Ruby宏,然后我收到错误:

Natvis: C:\Users\Thomas\Documents\Visual Studio 2013\Visualizers\SUbD.natvis(79,4): Error: identifier "NIL_P" is undefined
    Error while evaluating 'NIL_P(value_)' in the context of type 'SUbD.so!SUbD::ruby::Numeric'.

我尝试的规则是:

<Type Name="SUbD::ruby::Numeric">
  <DisplayString Condition="NIL_P(value_)">Ruby Numeric: Nil</DisplayString>
  <DisplayString>Ruby Numeric: {value_}</DisplayString>
</Type>

在我的项目中,我将Ruby的VALUE类型包装在小型C ++包装类中,用于常见类型,例如StringHashArray等。我已经能够为这些设置natvis规则了。但是当我想使用Ruby系统中的一些宏时,我总是会遇到错误。

是否无法在natvis个文件中使用宏?

1 个答案:

答案 0 :(得分:1)

http://msdn.microsoft.com/en-us/library/jj620914.aspx#BKMK_Expressions_and_formatting

“Natvis表达式是在可视化对象的上下文中进行评估的,而不是当前的堆栈帧。”调试器无法评估预处理器宏,因此可视化器也不能。您需要“手动”展开表达式的预处理器宏。例如,如果NIL_P定义为:

#define NIL_P(v) !((VALUE)(v) != Qnil)

然后你的natvis DisplayString标签必须是:

<DisplayString Condition="!((VALUE)(value_) != Qnil)">Ruby Numeric: Nil</DisplayString>