0

我刚刚了解.natvis了 Visual Studio 中的文件,并且一直在为我的 Ruby C++ 扩展项目设置一些文件。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++ 包装类中,用于常见类型,例如String,HashArray。我已经能够为这些设置 natvis 规则。但是每当我想使用 Ruby 系统中的一些宏时,我总是会出错。

natvis不能在文件中使用宏吗?

4

1 回答 1

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>
于 2014-12-11T12:51:09.483 回答