Partilhar via


Restrições sobre expressões C++ nativo

This topic applies to:

Edition

Visual Basic

C#

F#

C++

Web Developer

Express

O tópico não é aplicável O tópico não é aplicável O tópico não é aplicável

Native only

O tópico não é aplicável

Pro, Premium e Ultimate

O tópico não é aplicável O tópico não é aplicável O tópico não é aplicável

Native only

O tópico não é aplicável

When you enter a C/C++ expression in a debugger window, these general restrictions apply:

Access Control

The debugger can access all class members regardless of access control. You can examine any class object member, including base classes and embedded member objects.

Ambiguous References

If a debugger expression refers to an ambiguous member name, you must use the class name to qualify it. Por exemplo, se CObject é uma instância de CClass, que herda funções membro chamadas expense de ambos AClass e BClass, CObject.expense é ambíguo. You can resolve the ambiguity like this:

CObject.BClass::expense

To resolve ambiguities, the expression evaluator applies normal dominance rules regarding member names.

Anonymous Namespaces

The native C++ expression evaluator does not support anonymous namespaces. Suppose, for example, you have the following code:

#include "stdafx.h"

namespace mars

{

namespace

{

int test = 0;

}

}

int main()

{

// Adding a watch on test does not work.

mars::test++;

return 0;

}

A única maneira de observar o símbolo test neste exemplo é usar o nome decorado:

(int*)?test@?A0xccd06570@mars@@3HA

Constructors, Destructors, and Conversions

You cannot call a constructor or destructor for an object, either explicitly or implicitly, using an expression that calls for construction of a temporary object. For example, the following expression explicitly calls a constructor and results in an error message:

Date( 2, 3, 1985 )

You cannot call a conversion function if the destination of the conversion is a class. Such a conversion involves the construction of an object. Por exemplo, se myFraction é uma instância de CFraction, que define o operador de conversão FixedPoint, a expressão a seguir resulta em um erro:

(FixedPoint)myFraction

However, you can call a conversion function if the destination of the conversion is a built-in type. Se CFraction define uma função de conversão operator float, a expressão a seguir é legal no depurador:

(float)myFraction

You can call functions that return an object or declare local objects.

Você não pode chamar o new ou delete operadores. The following expression does not work in the debugger:

new Date(2,3,1985)

Inheritance

When you use the debugger to display a class object that has virtual base classes, the members of the virtual base class are displayed for each inheritance path, even though only one instance of those members is stored.

Virtual function calls are properly handled by the expression evaluator. Por exemplo, suponha que a classe CEmployee define uma função virtual computePay, que será redefinido em uma classe que herda de CEmployee. Você pode chamar computePay através de um ponteiro para CEmployee e tem a função apropriada executada:

empPtr->computePay()

You can cast a pointer to a derived class object into a pointer to a base class object. The reverse cast is not permitted.

Intrinsic and Inlined Functions

A debugger expression cannot call an intrinsic or inlined function unless the function appears at least once as a normal function.

Numeric Constants

Debugger expressions can use integer constants in octal, hexadecimal, or decimal format. By default, the debugger expects decimal constants. This setting can be changed on the General page of the Debugging tab.

You can use prefix or suffix symbols to represent numbers in another base. The following table shows the forms you can use.

Syntax

Example (decimal 100)

Base

dígitos

100 or 64

Decimal or hexadecimal, depending on the current setting.

0dígitos

0144

Octal (base 8)

0ndígitos

0n100

Decimal (base 10)

0xdígitos

0x64

Hexadecimal (base 16)

dígitosh

64h

Hexadecimal (base 16)

Operator Functions

A debugger expression can invoke operator functions for a class implicitly or explicitly. Por exemplo, suponha que myFraction e yourFraction são instâncias de uma classe que define operator+. You can display the sum of those two objects using this expression:

myFraction + yourFraction

If an operator function is defined as a friend, you can call it implicitly using the same syntax as for a member function, or you can invoke it explicitly, as follows:

operator+( myFraction, yourFraction )

Like ordinary functions, operator functions cannot be called with arguments that require a conversion involving object construction.

The debugger does not support overloaded operators with both const and non-const versions. Overloaded operators with const and non-const versions are used frequently in the Standard Template Library.

Overloading

A debugger expression can call overloaded functions if an exact match exists or if a match does not require a conversion involving object construction. Por exemplo, se a calc função leva um CFraction objeto como um parâmetro e o CFraction classe define um construtor de argumento único que aceita um inteiro, a expressão a seguir resulta em um erro:

calc( 23 )

Mesmo que exista uma conversão legal para converter o inteiro para o CFraction de objeto que calc espera, tal conversão envolve a criação de um objeto e não é suportado.

Precedence

Em expressões do depurador, operador de escopo C++ (::) tem precedência menor do que ele na fonte de código. In C++ source code, this operator has the highest precedence. No depurador, sua precedência cai entre os operadores base e postfix (->, ++, --) e os operadores unários (!, &, *e outros).

Symbol Formats

Você insere uma expressão no depurador contendo símbolos no mesmo formato usado no código-fonte, contanto que os símbolos estejam em um módulo compilado com informações de depuração completas (/Zi ou /ZI). Se você inserir uma expressão que contenha símbolos públicos, que são símbolos encontrados em bibliotecas ou nos módulos compilados com /Zd, você deve usar o nome decorado do símbolo, o formulário usado no código objeto. For more information, see /Z7, /Zd, /Zi, /ZI (Debug Information Format).

You can get a listing of all names in their decorated and undecorated forms using the LINK /MAP option. For more information, see /MAP (Generate Mapfile).

Name decoration is the mechanism used to enforce type-safe linkage. This means that only the names and references with precisely matching spelling, case, calling convention, and type are linked together.

Nomes declarados com C, convenção de chamada, implicitamente ou explicitamente usando a _cdecl palavra-chave, começam com um sublinhado ( _ ). Por exemplo, a função main pode ser exibido como _main. Nomes declarados como _fastcall começam com o @ símbolo.

For C++, the decorated name encodes the type of the symbol in addition to the calling convention. This form of the name can be long and difficult to read. O nome começa com pelo menos um ponto de interrogação (?). For C++ functions, the decoration includes the function scope, the types of the function parameters, and the function return type.

Type Casting

If you cast to a type, the type must be known to the debugger. You must have another object of that type in your program. Tipos criados usando typedef não são instruções suportadas.

Consulte também

Outros recursos

Expressões de linguagem C++ nativa