2011-01-10 10 views
5

considerar mi código C++ a continuación:expresión de Visual Studio que contiene un término llamado "por" no puede ser evaluada en la ventana de inspección

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

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

    return 0; 
} 

que funciona muy bien. Lo curioso es con la variable "por". Si trato de agregar un reloj para una expresión simple que contiene, el resultado será CXX0030: Error: la expresión no se puede evaluar.

Por ejemplo, en un punto de interrupción en return 0, si añado los siguientes relojes puedo obtener los resultados mencionados:

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 

Esto ocurre en VS2010, VS2008 en varios equipos.

Entonces, más por curiosidad, ¿qué está pasando con "por"? ¿Es algún tipo de operador extraño? ¿Por qué no recibe el mismo tratamiento?

(que he probado en Google sobre esto, pero es bastante difícil de conseguir algunos éxitos relevantes con términos como "por")

+2

un informe de error, lo tengo aquí también – stijn

+0

Ahhh, mis esperanzas son que se trata de algún tipo de característica oculta: D, no sólo un error ordinario. –

+1

El "operando faltante" es especialmente sorprendente. – aschepler

Respuesta

7

Lo que está viendo aquí es la implementación del Evaluador de Expresiones de C++ del operador BY. Su uso de la expresión BY se interpreta como un operador en lugar de una variable local.

Referencia: http://msdn.microsoft.com/en-us/library/56638b75.aspx

mucha discusión sobre si ha pasado o no este comportamiento es un error o por diseño. Lamentablemente, solo las personas que implementaron la función pueden responder verdaderamente. Por insatisfactorio que sea para este escenario, podría haber razones válidas por las que esto se hizo explícitamente (los costos de la desambiguación vienen a la mente). O esto podría ser simplemente un descuido del implementador. Nuevamente solo ellos saben la respuesta.

Si esto le parece un error, por favor, presente un error al conectar. Esta es la mejor forma de expresar su opinión y es muy probable que el equipo nunca haya recibido comentarios sobre este comportamiento (no pude encontrar ninguno en mis búsquedas).

+0

"Este comportamiento es por diseño". Como dije en otro lugar, solo otro colapso de Microsoft. ¡Qué decisión tan estúpida de diseño! – TonyK

+0

@TonyK habilitando un conjunto completo de funciones de depuración a costa de no poder depurar una variable llamada específicamente ... Lo llamaría una victoria. Sí, podrían haber hecho más para calmar este escenario, pero dada la extrema facilidad del trabajo, sigue siendo una victoria. – JaredPar

+0

¿Intervención? ¿Qué solución? La solución habría consistido en exigir que las expresiones de Lenguaje de Asamblea estén precedidas por un carácter especial. '@', por ejemplo. ¿Es eso un shim? No estoy familiarizado con el término. – TonyK

8

intrigado por esto, hice algo de investigación. Desde this link, vemos que el evaluador de expresiones C/C++ nativo en el depurador maneja las expresiones de lenguaje ensamblador; siguiendo el Assembly-language link, descubrimos que BY es la abreviatura de BYTE en una expresión de lenguaje ensamblador. Así que solo otro colapso de Microsoft

+0

Revocó las ediciones y los comentarios eliminados para que no haya discontinuidad entre los dos. ¡Disfruta la insignia! :) –

+0

@Bill the Lizard: Espero que no te importe si te llamo un viejo pedo aburrido. – TonyK

+0

@TonyK: ¡Sal de mi césped! ;) –

4

Lo que se está ejecutando en es del depurador '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.

Cuestiones relacionadas