2011-01-10 2 views
5

Рассмотрим моего C++ код ниже:выражения Visual Studio, содержащее термин под названием «от» не может быть оценено в окне просмотра

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int by = 10; 
    printf("%d\n", by); 

    int bx = 20; 
    printf("%d\n", (by + bx)); 

    return 0; 
} 

, который работает отлично. Самое смешное - с переменной «by». Если я попытаюсь добавить часы для простого выражения, которое содержит, результатом будет CXX0030: Ошибка: выражение не может быть оценено.

Например, на контрольной точке на return 0, если добавить следующие часы я получаю результаты упомянутых:

by : 10 
bx : 20 
by + 5 : CXX0030: Error: expression cannot be evaluated 
bx + 5 : 25 
by + bx : CXX0030: Error: expression cannot be evaluated 
(by) + bx : 30 
by + (bx) : CXX0030: Error: expression cannot be evaluated 
bx + (by) : CXX0014: Error: missing operrand 

Это происходит на VS2010, VS2008 на нескольких компьютерах.

Итак, больше из любопытства, что происходит с «по»? Это какой-то странный оператор? Почему bx не получает такое же лечение?

(Я пытался Google на это, но это довольно трудно получить некоторые соответствующие хиты с терминами, как «по»)

+2

отчет об ошибке, он у меня здесь тоже – stijn

+0

Ааа, мои надежды, что это какое-то скрытая функция: D, а не только обычная ошибка. –

+1

«Отсутствующий операнд» - особенно брови. – aschepler

ответ

7

Что вы видите здесь, это реализация C++ Expression Evaluator для оператора BY. Ваше использование выражения BY интерпретируется как оператор вместо локальной переменной.

Ссылка: http://msdn.microsoft.com/en-us/library/56638b75.aspx

Много дискуссий пошел в том или нет такое поведение является ошибка или дизайн. К сожалению, на них могут ответить только люди, которые внедрили эту функцию. Как неудовлетворенность, так и для этого сценария, могут быть веские причины, по которым это было сделано явно (на ум приходит умение устранять неоднозначность). Или это может быть просто надзор над разработчиком. Опять только они знают ответ.

Если это действительно похоже на ошибку, пожалуйста, сообщите об ошибке при подключении. Это лучший способ услышать ваше мнение и, скорее всего, команда никогда не получала никакой обратной связи по этому поведению (в моих поисках не было найдено ни одного).

+0

«Такое поведение по дизайну». Как я сказал где-то еще, просто еще один взмах. Какое глупое дизайнерское решение! – TonyK

+0

@TonyK, позволяющий использовать весь набор функций отладчика за счет того, что вы не можете отлаживать очень специфическую именованную переменную ... Я бы назвал ее победой. Да, они могли бы сделать больше, чтобы подделать этот сценарий, но с учетом крайней легкости работы вокруг это все еще победа. – JaredPar

+0

Работа вокруг? Какая работа? Обход должен был требовать, чтобы выражениям Assembly-Language предшествовал специальный символ. '@', например. Это прокладка? Я не знаком с этим термином. – TonyK

8

Заинтересовавшись этим, я сделал некоторые рыть. Из this link мы видим, что собственный оценщик выражений C/C++ в отладчике обрабатывает выражения Assembly-Language; после Assembly-language link, мы обнаруживаем, что BY является коротким для BYTE в выражении Assembly-Language. Таким образом, просто еще один взлом Microsoft

+0

Отправил изменения и удаленные комментарии, так что между ними нет разрыва. Наслаждайтесь значком, хотя! :) –

+0

@Bill the Lizard: Надеюсь, вы не возражаете, если я назову вас скучным старым пердом. – TonyK

+0

@TonyK: Сходите с газона !!! ;) –

4

То, что вы бежите в этот отладчике 'memory operator':

In native C++, debugger expressions do support the following additional operators:

  • The context operator ({ }) to specify the context of a symbol. For more information, see Context Operator (C/C++ Language Expressions).

  • Memory operators (BY, WO, and DW) to access memory. Memory operators have the lowest precedence of any operator. The memory operators are useful mainly in debugging assembly-language code.