2011-01-10 9 views
5

considerare il mio codice C++ di seguito:visivo Expression Studio contenente un termine chiamato "con" non può essere valutata nella finestra di controllo

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

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

    return 0; 
} 

che funziona bene. La cosa divertente è con la variabile "by". Se provo ad aggiungere un orologio per un'espressione semplice che contiene, il risultato sarà CXX0030: Errore: l'espressione non può essere valutata.

Ad esempio, su un punto di interruzione return 0, se aggiungo le seguenti orologi ottengo i risultati citati:

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 

questo accade in VS2010, VS2008 su più computer.

Quindi, più per curiosità, cosa sta succedendo con "by"? È una specie di strano operatore? Perché non ottiene lo stesso trattamento?

(ho provato google su questo, ma è abbastanza difficile da ottenere alcuni colpi importanti con termini come "da")

+2

un bug report, ho anche qui – stijn

+0

Ahhh, le mie speranze sono che questo è una sorta di caratteristica nascosta: D, non solo un bug ordinario. –

+1

L'"operando mancante" è sopracciglio in particolare. – aschepler

risposta

7

Quello che vedete qui è l'implementazione del C++ Expression Evaluator dell'operatore BY. L'utilizzo dell'espressione BY viene interpretato come operatore anziché come variabile locale.

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

Un sacco di discussione è stato fatto per se questo comportamento è un bug o di progettazione. Sfortunatamente ciò può essere veramente risolto dalle persone che hanno implementato la funzione. Per quanto insoddisfacente per questo scenario, ci potrebbero essere validi motivi per cui ciò è stato esplicitamente fatto (i costi del disambiguating vengono in mente). O questo potrebbe semplicemente essere una svista dell'attore. Di nuovo solo loro conoscono la risposta.

Se ciò ti sembra un bug, ti preghiamo di inviare un bug al collegamento. Questo è il modo migliore per far sentire la tua opinione e molto probabilmente il team non ha mai ricevuto alcun feedback su questo comportamento (non ho trovato nessun risultato nelle mie ricerche).

+0

"Questo comportamento è di progettazione." Come ho detto da qualche altra parte, solo un altro cock-up di Microsoft. Che stupida decisione di design! – TonyK

+0

@TonyK abilita un intero set di funzionalità del debugger al costo di non essere in grado di eseguire il debug di una variabile con un nome molto specifico ... La chiamerei una vittoria. Sì, avrebbero potuto fare di più per dare uno spessore a questo scenario ma, data l'estrema facilità del lavoro, è comunque una vittoria. – JaredPar

+0

Work-around? Cosa funziona? La soluzione sarebbe stata quella di richiedere che le espressioni in linguaggio Assembly fossero precedute da un carattere speciale. '@', per esempio. È uno spessore? Non ho familiarità con il termine. – TonyK

8

Incuriosito da questo, ho fatto qualche ricerca. Da this link, vediamo che l'analizzatore di espressioni C/C++ nativo nel debugger gestisce le espressioni Assembly-Language; seguendo lo Assembly-language link, scopriamo che BY è l'abbreviazione di BYTE in un'espressione Assembly-Language. Quindi, solo un altro Microsoft cock-up

+0

Arrotondato le modifiche e i commenti eliminati in modo che non ci sia discontinuità tra i due. Goditi il ​​distintivo! :) –

+0

@Bill the Lizard: Spero non ti dispiaccia se ti chiamo una noiosa vecchia scoreggia. – TonyK

+0

@ Tony: scendi dal mio prato !!! ;) –

4

Cosa si sta eseguendo in è del debugger '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.

Problemi correlati