Compartilhar via


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

Este tópico se aplica a:

Edição

Visual Basic

C#

C++

Desenvolvedores Web

Express

Somente nativo

Padrão

Somente nativo

PRO e equipe

Somente nativo

Legenda de tabela:

Aplica-se

Não é aplicada

Comando ou comandos oculta por padrão.

Quando você insere uma expressão C/C ++ em uma janela do depurador, estas restrições gerais se aplicam:

Controle de acesso

O depurador pode acessar todos os membros de classe independentemente do controle de acesso.Você pode examinar qualquer membro de objeto de classe, incluindo classes base e objetos membros incorporados .

Referências ambíguas

Se uma expressão do depurador se referir a um nome de membro ambíguo, você deve usar o nome de classe para qualificá-lo.Por exemplo, se CObject é uma instância de CClass, que herda funções membro chamadas expense para ambos AClass e BClass, CObject.expense é ambíguo. Você pode resolver a ambiguidade dessa forma:

CObject.BClass::expense

Para resolver ambiguidades, o avaliador de expressão aplica as regras de precedência normais referentes a nomes de membros.

Namespaces anônimos

O avaliador de expressão C++ nativo não dá suporte a namespaces anônimos.Suponha que, por exemplo, você tem o código a seguir:

#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 inspeção o símbolo test Neste exemplo é usar o nome decorado:

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

Construtores, Detrutores, e Conversões

Não é possível chamar um construtor ou destrutor de um objeto, explicitamente ou implicitamente, usando uma expressão que chama a construção de um objeto temporário.Por exemplo, a expressão a seguir chama explicitamente um construtor e resulta em uma mensagem de erro:

Date( 2, 3, 1985 )

Não é possível chamar uma função de conversão se o destino da conversão é uma classe.Tal conversão envolve a construção de um objeto.Por exemplo, se myFraction é uma instância de CFraction, que define o operador de função de conversão FixedPoint, a expressão a seguir resultados em um erro:

(FixedPoint)myFraction

No entanto, você pode chamar uma função de conversão se o destino da conversão for um tipo interno.If CFraction define uma função de conversão operator float, a expressão a seguir é legal no depurador:

(float)myFraction

Você pode chamar funções que retornam um objeto ou declarar objetos locais.

Não é possível telefonar o new ou delete operadores. A expressão a seguir não funciona no depurador:

new Date(2,3,1985)

Herança

Quando você usar o depurador para exibir um objeto de classe que tenha classes base virtuais, os membros da classe base virtual são exibidos para cada caminho de herança, mesmo que apenas uma instância desses membros esteja armazenado.

Chamadas de função virtual são manipuladas corretamente pelo avaliador de expressão.Por exemplo, suponha que a classe CEmployee define uma função virtual computePay, que é redefinido em uma classe que herda de CEmployee. Você pode chamar computePay através de um ponteiro para CEmployee e tiver a função apropriada executada:

empPtr->computePay()

Você pode converter um ponteiro de um objeto de classe derivada em um ponteiro de um objeto de classe base.A conversão inversa não é permitido.

Funções intrínsecas e in-line

Uma expressão de depurador não pode chamar uma função intrínseca ou in-line a menos que a função apareça como uma função normal pelo menos uma vez.

Constantes numéricas

As expressões de depurador podem usar constantes inteiras em octal, hexadecimal, ou formato decimal.Por padrão, o depurador espera constantes decimais.Essa configuração pode ser alterada na página General da guia Debugging.

Você pode usar símbolos de prefixo ou sufixo para representar números em outra base.A tabela a seguir mostra as formas de uso.

Sintaxe

Exemplo (100 decimal)

Base

dígitos

100 ou 64

Decimal ou hexadecimal, dependendo da configuração atual.

0dígitos

0144

Octal (base 8)

0ndígitos

0n100

Decimal (base 10)

0xdígitos

0x64

Hexadecimal (base 16)

dígitosh

64h

Hexadecimal (base 16)

Funções de operador

Uma expressão do depurador pode chamar implícita ou explicitamente funções de operador para uma classe.Por exemplo, suponha que myFraction e yourFraction são instâncias de uma classe que define operator+. Você pode exibir a soma desses dois objetos usando esta expressão:

myFraction + yourFraction

Se uma função de operador é definida como friend, você pode chamá-la implicitamente usando a mesma sintaxe de uma função membro, ou você pode chamá-la explicitamente, da seguinte forma:

operator+( myFraction, yourFraction )

Assim como funções comuns, funções de operador não podem ser chamadas com argumentos que exigem uma conversão envolvendo a construção de um objeto.

O depurador não dá suporte a operadores sobrecarregados com as versões const e não const.Operadores sobrecarregados com versões const e não const são usados com frequência na Standard Template Library.

Sobrecarga

Uma expressão do depurador pode chamar funções sobrecarregadas se existir uma correspondência exata ou se a correspondência não requerer uma conversão envolvendo a construção de um objeto.Por exemplo, se o calc função leva uma CFraction objeto sistema autônomo um parâmetro e o CFraction classe define um construtor de argumento único que aceita um inteiro, sistema autônomo seguintes resultados da expressão em um erro:

calc( 23 )

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

Precedência

Em expressões do depurador, o operador de escopo C++ (::) tem precedência menor do que no código-fonte. No código fonte C++, esse operador tem a precedência mais alta.No depurador, sua precedência cai entre os operadores base e postfix (->, ++, --) e o () operadores unários!, &, *e outros).

Formatos de símbolo

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 depurar 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 do objeto. Para obter mais informações, consulte /Z7, /Zd, /Zi, /ZI (formato informações de depuração).

Você pode obter uma lista de todos os nomes em seus formatos decorados e não decorados usando a opção LINK /MAP.Para obter mais informações, consulte /MAP (Gerar Mapfile).

Decoração do nome é o mecanismo usado para impor vinculação de tipo segura.Isso significa que somente os nomes e referências com ortografia exatamente correspondentes, maiúsculas/minúsculas correspondentes, convenção de chamada, e tipo são vinculados juntos.

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

Para C++, o nome decorado codifica o tipo de símbolo juntamente com a convenção de chamada.Esta forma de nome pode ser longa e difícil de ser lido.O nome começa com pelo menos um ponto de interrogação (?). Para funções C++, a decoração inclui o escopo função, os tipos de parâmetros da função, e o tipo de retorno da função.

Conversão de Tipo

Se você converter para um tipo, o tipo deve ser conhecido pelo depurador.Você deve ter outro objeto do mesmo tipo em seu programa.Tipos criados usando typedef Não há suporte para instruções.

Consulte também

Outros recursos

Expressões de linguagem C++ nativa