Partilhar via


Expressões em C++ nativo

O depurador aceita a maioria da Microsoft e de expressões ANSI ++.O depurador também fornece funções intrínsecas e operadores de contexto para fazer expressões de avaliação mais seguras e mais conveniente.Este tópico também descreve as restrições em expressões de C++ que precisam estar cientes do seguinte:

Você não pode usar o operador de contexto ou a maioria dos especificadores de formato em código ou com expressões de script ou código gerenciado.São específicos para avaliador de expressão de nativo C++.

Nesta seção

Usando funções intrinisic do depurador para manter o estado

Usando operadores de contexto para especificar um símbolo

Restrições em expressões nativos de C++

  • Controle de acesso

  • Referências ambíguas

  • Namespaces anônimos

  • Construtores, destruidores, e conversões

  • Herança

  • Inlined funções e intrínsecas do compilador

  • Constantes numéricas

  • Funções de operador

  • Sobrecarga

  • Precedência

  • Formatos do símbolo

  • Conversão de tipo

Usando funções intrinisic do depurador para manter o estado

As funções intrínsecas do depurador oferece uma maneira para chamar funções de determinadas C/C++ em expressões sem alterar o estado do aplicativo.

Funções intrínsecas do depurador:

  • São garantidos para ser seguro: executando uma função intrínseca do depurador não danificará o processo que está sendo depurado.

  • São permitidos em todas as expressões, mesmo em situações onde os efeitos colaterais e a avaliação de função não são permitidos.

  • Trabalhar em situações onde as chamadas de função normais não são possíveis, como depurar um minidump.

As funções intrínsecas do depurador também podem ser expressões de avaliação mais conveniente.Por exemplo, strncmp(str, “asd”) é mais fácil para escrever em uma condição de ponto de interrupção em que str[0] == ‘a’ && str[1] == ‘s’ && str[2] == ‘d’.)

Área

Funções intrínsecas

Comprimento da cadeia de caracteres

strlen, wcslen, strnlen, wcsnlen

Comparação de cadeia de caracteres

strcmp, wcscmp, stricmp, _stricmp, _strcmpi, wcsicmp, _wcscmpi, _wcsnicmp, strncmp, wcsncmp, strnicmp, wcsnicmp

Pesquisa de cadeia de caracteres

strchr, wcschr, strstr, wcsstr

Win32

GetLastError(), TlsGetValue()

Windows 8

WindowsGetStringLen(), WindowsGetStringRawBuffer()

Essas funções requerem o processo que está sendo depurado executar no Windows 8.Depuração dos arquivos de despejo gerado de um dispositivo do Windows 8 também requer que o computador do Visual Studio está executando o Windows 8.No entanto, se você está depurando um dispositivo do Windows 8 remotamente, o computador do Visual Studio pode executar o Windows 7.

Diversos

__log2

Retorna a base 2 de um inteiro especificado, arredondada para o inteiro mais baixo o mais próximo.

Usando operadores de contexto para especificar um símbolo

O operador de contexto é um operador adicional fornecido pelo depurador nativo.Para depurar o código nativo, você pode usar o operador de contexto para qualificar um local, um nome de variável, ou uma expressão de ponto de interrupção.O operador de contexto é útil para fins como especificar um nome de um escopo externo que está oculta de outra forma por um nome local.

Sintaxe

{,módulo[]} expressão

  • módulo é o nome de um módulo.Você pode usar um caminho completo para desambiguar entre os módulos com o mesmo nome.

  • expressão é qualquer expressão válida de C++ que resolver a um destino válido, como um nome de função, um nome de variável, ou endereço do ponteiro em módulo.

As teclas devem conter duas vírgulas e o nome ou o caminho completo de módulo (executável ou DLL).

Por exemplo, para definir um ponto de interrupção na função de SomeFunction de EXAMPLE.dll:

{,,EXAMPLE.dll}SomeFunction

Se o caminho de módulo inclui uma vírgula, um espaço inserido, ou uma chave, você deve usar aspas ao redor do caminho de modo que o analisador de contexto possa reconhecer corretamente a cadeia de caracteres.As aspas simples são considerados parte de um nome de arquivo do Windows, portanto você deve usar aspas duplas.Por exemplo,

{,"a long, long, library name.dll", } g_Var

Quando o avaliador de expressão encontrar um símbolo em uma expressão, procura pelo símbolo na seguinte ordem:

  1. Escopo lexicalmente externo, começando com o bloco atual, série de instruções envolto em chaves, e a seguir para fora com o bloco delimitador.O bloco atual é o código que contém o local atual, endereço do ponteiro de declaração.

  2. Escopo da função.A função atual.

  3. Ordena o escopo, se o local atual é função de membro interna de c++.O escopo de classe inclui todas as classes base.O avaliador de expressão usa as regras normais de domínio.

  4. Símbolos globais no módulo atual.

  5. Símbolos públicos no programa atual.

Com o operador de contexto, você especifica o módulo inicial de pesquisa e ignora o local atual.

Restrições em expressões nativos de C++

Quando você insere a expressão de energia AC /C ++ em uma janela do depurador, essas limitações gerais se aplicam:

y2t7ahxk.collapse_all(pt-br,VS.110).gifControle de acesso

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

y2t7ahxk.collapse_all(pt-br,VS.110).gifReferências ambíguas

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

CObject.BClass::expense

Para resolver ambiguidades, o avaliador de expressão aplica regras normais de domínio em relação aos nomes de membros.

y2t7ahxk.collapse_all(pt-br,VS.110).gifNamespaces anônimos

O avaliador de expressão de nativo C++ não suporta namespaces anônimos.Suponha, por exemplo, o têm o seguinte código:

#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 examinar o símbolo test nesse exemplo é usar o nome adornado:

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

y2t7ahxk.collapse_all(pt-br,VS.110).gifConstrutores, destruidores, e conversões

Você não pode chamar um construtor ou um destrutor para um objeto, explícita ou implicitamente, usando uma expressão que chama para a compilação de um objeto temporário.Por exemplo, a expressão a seguir chama explicitamente um construtor e resultados em uma mensagem de erro:

Date( 2, 3, 1985 )

Você não pode chamar uma função de conversão se o destino de conversão é uma classe.Tal conversão envolve a compilação de um objeto.Por exemplo, se myFraction é uma instância de CFraction, que define o operador FixedPointde função de conversão, os seguintes resultados da expressão em um erro:

(FixedPoint)myFraction

No entanto, você pode chamar uma função de conversão se o destino de conversão é um tipo interno.Se CFraction define uma função operator floatde conversão, a seguinte expressão é legal no depurador:

(float)myFraction

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

Você não pode chamar os operadores de new ou de delete .A seguinte expressão não funciona no depurador:

new Date(2,3,1985)

y2t7ahxk.collapse_all(pt-br,VS.110).gifHerança

Quando você usa o depurador para exibir um objeto da classe que tem 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 seja armazenada.

As chamadas de função virtuais são tratadas 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 ter a função apropriada executada:

empPtr->computePay()

Você pode converter um ponteiro para um objeto da classe derivada em um ponteiro para um objeto da classe base.Você pode converter um ponteiro para um objeto da classe base em um ponteiro para um objeto de classe derivada, exceto quando a herança é virtual.

y2t7ahxk.collapse_all(pt-br,VS.110).gifInlined funções e intrínsecas do compilador

Uma expressão do depurador não pode chamar um compilador funções intrínsecas ou função inlined a menos que a função aparecer pelo menos uma vez como uma função normal.

y2t7ahxk.collapse_all(pt-br,VS.110).gifConstantes numéricas

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

Você pode usar símbolos de prefixo ou do sufixo para representar números em outros base.A tabela a seguir mostra os formulários que você pode usar.

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)

y2t7ahxk.collapse_all(pt-br,VS.110).gifFunções de operador

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

myFraction + yourFraction

Se uma função de operador é definida como um amigo, você pode chamá-la usando implicitamente a mesma sintaxe que para uma função de membro, ou você pode explicitamente invoke, como segue:

operator+( myFraction, yourFraction )

Como funções comuns, as funções de operador não podem ser chamadas com argumentos que requerem uma conversão que envolve a compilação de objeto.

O depurador não suporta operadores sobrecarregados com versões const e não const.Os operadores sobrecarregados com versões const e não const são frequentemente usados na biblioteca padrão do modelo.

y2t7ahxk.collapse_all(pt-br,VS.110).gifSobrecarga

Uma expressão do depurador pode chamar funções sobrecarregadas se um exata a correspondência existe ou se uma correspondência não requer uma conversão que envolve a compilação de objeto.Por exemplo, se a função de calc utiliza um objeto de CFraction como um parâmetro, e a classe de CFraction define um construtor que aceita um inteiro, os seguintes resultados de único argumento de expressão em um erro:

calc( 23 )

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

y2t7ahxk.collapse_all(pt-br,VS.110).gifPrecedência

Em expressões do depurador, o operador de escopo do C++ (::) tem uma menor precedência de que ele faz no código-fonte.No código-fonte do C++, esse operador tem a precedência mais alta.No depurador, a precedência está entre a base e operadores de pós-fixação (->, ++, --) e operadores unários (!, &, *, e outros.)

y2t7ahxk.collapse_all(pt-br,VS.110).gifFormatos do símbolo

Você inserir uma expressão do depurador que contém símbolos no mesmo formulário usado no código-fonte, desde que os símbolos estão em um módulo compilado com informações completa de depuração (/Zi ou /ZI).Se você inserir uma expressão que contém os símbolos públicos, que são símbolos encontrados nas bibliotecas ou em módulos compilados com /Zd, você deve usar o nome adornado do símbolo, o formulário usado no código de objeto.Para obter mais informações, consulte /Z7, /Zd, /Zi, /ZI (formato de informações de depuração).

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

A decoração de nome é o mecanismo usado para forçar o ligação de tipos seguros.Isso significa que apenas os nomes e referências com ortografia compatível com precisão, caso, convenção de chamada, e tipo estão associados juntos.

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

Para C++, o nome adornado codificação o tipo do símbolo além da convenção de chamada.Este formulário de nome pode ser demorado e difícil de ler.O nome começa com pelo menos um ponto de interrogação (?).Para funções de C++, a decoração inclui o escopo de função, os tipos dos parâmetros de função, e o tipo de retorno da função.

y2t7ahxk.collapse_all(pt-br,VS.110).gifConversão de tipo

Se você converter para um tipo, o tipo deve ser conhecido no depurador.Você deve ter um outro objeto do tipo em seu programa.Os tipos criados usando instruções de typedef não são suportados.