Я только что узнал о .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’s VALUE
введите небольшие классы оболочки C ++ для распространенных типов, таких как String
, Hash
, Array
и т.д. И я смог установить правила natvis для них. Но всякий раз, когда я хочу использовать некоторые макросы из системы Ruby, я всегда получаю ошибки.
Разве нельзя использовать макросы в natvis
файлы?
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>