Управляемые выражения в C++
Вычислитель выражений управляемого кода может обрабатывать большинство выражений на языке Visual C++. В следующих разделах содержатся сведения о типах выражений и рассматриваются некоторые типы, не поддерживаемые вычислителем:
Идентификаторы и типы
Вычисление функций
Операторы
Перегруженные операторы
Строки
Приведение типов
Сравнение и назначение объектов
Операторы "typeof" и "sizeof"
Упаковка
Вычисление свойств
Вычислитель выражений игнорирует квалификаторы доступа: public, protected, internal и private. Например, можно вызвать метод private из окна Контрольные значения.
Вычислитель выражений выполняет все вычисления в небезопасном неявном контексте, независимо от того, является ли выполняемый код безопасным или нет.
Для отображения содержимого типа данных в понятном и удобочитаемом виде отладчик использует правила автоподстановки. При необходимости можно добавить пользовательские элементы автоподстановки для отображения пользовательских типов данных. Дополнительные сведения см. в разделе Отображение элементов пользовательского типа данных.
Идентификаторы и типы
В выражениях отладчика можно использовать любые идентификаторы, видимые в пределах текущей области. Например, если отладчик остановлен во время выполнения функции magh, можно использовать любые идентификаторы, видимые в области magh, включая константы, имена переменных и имена функций.
Отладчик правильно отображает любые переменные типа primitive, enum или intrinsic. Для переменных типа class отладчик правильно отображает значение на основе ближайшего производного типа. Если имеется объект leo типа lion, который является производным от типа cat, то можно вычислить leo.clawlength и получить правильное значение для объекта типа lion.
Можно назначить новое значение любому выражению левой части, которое является L-значением простого типа. Назначение новых значений выражениям типа "класс" и "массив" не поддерживается.
Вычисление функций
Отладчик поддерживает вычисление функций, в том числе перегруженных. Поэтому при вводе любого из следующих выражений отладчик вызовет нужную версию перегруженной функции:
kanga ()
kanga (roo)
При вычислении функции в отладчике фактически вызывается и выполняется код этой функции. Если функция имеет побочные эффекты, такие как выделение памяти или изменение значения глобальной переменной, вычисление функции в окне отладчика приведет к изменению состояния программы, что может привести к непредвиденным результатам.
При установке точки останова в перегруженной функции расположение точки останова зависит от способа указания функции. Если указывается только имя функции, отладчик установит по одной точке останова в каждой версии перегруженной функции с этим именем. Если указываются полная сигнатура, имя функции и полный список аргументов, отладчик установит одну точку останова в указанной версии перегруженной функции.
Операторы
Отладчик правильно вычисляет большинство встроенных операторов, в том числе перечисленные ниже.
Операторы отношения: (expr1 >expr2, expr1 < expr2, expr1 <= expr2, expr1 => expr2, expr1 == expr2, expr1 != expr2).
Логические операторы: (expr1 && expr2, expr1 || expr2).
Условный оператор: (expr1 ? expr2 : expr3) .
Арифметические операторы: ( expr1 + expr2, expr1 - expr2,expr1 * expr2, expr1 / expr2, expr1 % expr2).
Побитовые операторы: (expr1 & expr2, expr1 ^ expr2, expr1 | expr2, expr1 ~ expr2).
Операторы сдвига. Примеры: (expr1 >>expr2, expr1 <<expr2, expr1 >>> expr2).
Операторы присваивания: ( lvalue = expr2, lvalue *= expr2, lvalue /= expr2, lvalue %= expr2, lvalue += expr2, lvalue -= expr2, lvalue <<= expr2, lvalue >>=expr2, lvalue &= expr2, lvalue ^= expr2, lvalue |= expr2 ).
Унарные операторы. Примеры: ( +expr1, - expr1, expr1++, ++expr1, expr1--, --expr1 ).
Можно ввести последовательность выражений, используя запятую-оператор: expr1, expr2,expr3.
Перегруженные операторы
В отладчике можно использовать большинство перегруженных операторов.
Допустимы перегруженные инфиксные операторы +, -, /, % и &:
expr1 + expr2
expr1 expr2
expr1 / expr2
expr1 % expr2
expr1 & expr2
В отладчике не действуют перегруженные инфиксные операторы =, &&, &, ||, | и ^:
expr1 = expr2
expr1 && expr2
expr1 & expr2
expr1 || expr2
expr1 | expr2
expr1 ^ expr2
Для C++ не действуют перегруженные операторы отношения ==, !=, >, <, >= и <=:
expr1 == expr2
expr1 != expr2
expr1 > expr2
expr1 < expr2
expr1 >= expr2
expr1 <= expr2
В отладчике не действуют перегруженные инфиксные операторы |, ^, <<, >>, >, <, >= и <=:
expr1 | expr2
expr1 ^ expr2
expr1 << expr2
expr1 >> expr2
expr1 > expr2
expr1 < expr2
expr1 >= expr2
expr1 <= expr2
Поддерживаются перегруженные префиксные операторы +, -, ++, --, ! и ~.
+expr1
-expr1
++expr1
--expr1
!expr1
~expr1
Поддерживаются перегруженные постфиксные операторы ++ и --.
expr1++
expr1--
Поддерживается перегруженный оператор []:
- x[expr2]
Многомерные массивы
Для многомерных массивов вычислитель выражений C++ использует стиль синтаксиса C#. Например:
c[0,0]
Использование обычного синтаксиса C++ вызывает ошибку:
Ошибка c[0][0]: индекс "0" находится вне границ для указателя/массива "c"
Строки
Отладчик распознает оператор индексирования, если он применяется к строкам или массивам. Например, в отладчике можно ввести следующее:
"hello world"[0]
В окне Контрольные значения отобразится правильное значение:
'h'
Приведение типов
В отладчике поддерживаются простые выражения приведения типа:
(A)x
Выражения приведения типа с использованием указателей в отладчике не работают.
Также в отладчике не поддерживается пользовательское приведение типа для Visual C++.
Сравнение и назначение объектов
Сравнение и назначение объектов не поддерживается в отладчике для Visual C++.
Операторы "typeof" и "sizeof"
Отладчик поддерживает оператор "typeof", преобразуя его в эквивалентную функцию платформы .NET Framework.
typeof ( expression )
преобразуется в:
System.Type.GetType(expression )
Затем отладчик вычисляет это преобразованное выражение.
Отладчик не поддерживает оператор sizeof.
Упаковка–преобразование и распаковка–преобразование
Вычислитель выражений отладчика не поддерживает упаковку–преобразование и распаковку–преобразование в Visual C++. Дополнительные сведения см. в разделе Упаковка–преобразование и распаковка–преобразование. Если имеется целочисленная переменная i, которая с помощью упаковки была преобразована в объект, то отладчик будет вычислять i как целое число, а не как объект. Это может привести к непредвиденным результатам.
Вычисление свойств
Отладчик может вычислять свойства в любом окне переменной. Однако вычисление свойств в отладчике может иметь побочные эффекты, которые могут привести к непредвиденным и нежелательным результатам. Чтобы избежать побочных эффектов, вызванных случайными вычислениями, можно отключить поддержку вычисления свойств в диалоговом окне Параметры.
Веб-методы
Вызов веб-методов в окнах отладчика не поддерживается.