Alterações significativas no compilador do Visual C++ 2005

Este tópico discute as alterações de comportamento em Visual C++ 2005 que pode causar o código que trabalhou em uma versão anterior ou não compilados, ou se comportam de maneira diferente em time de execução.

Para obter mais informações sobre os novos recursos, consulte Alterações no Visual C++ 2005 e edições anteriores, Alterações no Visual C++ 2005 Libraries, e As alterações no compilador do Visual C++ 2005, idioma e ferramentas.

  • Ponteiro para membros agora exigem nome qualificado e &
    O código escrito para versões anteriores do compilador usadas apenas o nome do método agora dará C3867 de erro do compilador ou C4867 de aviso do compilador. Este diagnóstico é exigido pelo padrão C++.Agora, para criar um ponteiro para uma função de membro, o endereço do operador (&) deve ser usado com o nome totalmente qualificado do método.Não há necessidade de usar o & e o nome totalmente qualificado do método podem levar a bugs de lógica no código devido parênteses faltando em chamadas de função.Usando o nome da função sem uma resultados da lista de argumento em um ponteiro de função que é convertido para vários tipos.Esse código poderia ter compilado, entrelinhamento a um comportamento inesperado em tempo de execução.

  • A classe deve ser acessível a uma declaração de amigo
    Compiladores de C++ Visual antes para Visual C++ 2005 uma declaração de amigo para uma classe que não estava acessível no escopo da classe que contém a declaração de permissão. Agora, o compilador dará C2248 de erro do compilador. Para resolver esse erro, altere a acessibilidade da classe especificada na declaração do amigo.Essa alterar foi feita em conformidade com o padrão C++.

  • asm __int 3 agora é compilado para o nativo
    Quando compilado com /clr, __asm int 3 não causou o código nativo a ser gerado, o compilador traduzido a instrução para uma instrução de quebra do CLR. In Visual C++ 2005, __asm int 3 Agora resultados na geração de código nativo para a função. Se você desejar que uma função para fazer com que um ponto de interrupção em seu código e se você desejar que essa função compilada para MSIL, use __debugbreak. Para obter mais informações, consulte __asm e o CLR (ComComummon Idioma Tempo de execução ComComumpilation).Essa alterar foi feita para ser mais determinista sobre para gerar código nativo em vez de código gerenciado; código de assembly embutido deve gerar código nativo.

  • Especialização explícita não é permitida sistema autônomo um operador de atribuição do construtor/copiar cópia
    Código que depende de uma especialização de modelo explícita para um construtor de cópia ou operador de atribuição de cópia agora terá C2299 de erro do compilador. Isso proíbe o C++ padrão.Essa alterar foi feita por motivos de conformidade, para tornar o código mais portátil.

  • Modelo de classe unspecialized não pode ser usado sistema autônomo um argumento de modelo em uma lista de classe base
    Usar um nome de classe unspecialized modelo na lista de classe base para uma definição de classe resultará em C3203 de erro do compilador. É ilegal para usar um nome de classe unspecialized modelo sistema autônomo um parâmetro de modelo em uma lista de classe base.Adicione explicitamente sistema autônomo parâmetros de tipo de modelo do nome de classe do modelo quando ele usado sistema autônomo um parâmetro de modelo em uma lista de classe base.Essa alterar foi feita por motivos de conformidade, para tornar o código mais portátil.

  • A declaração de tipo aninhado não pode mais usar
    Código que possui um usando o declaração para um tipo aninhado agora irá gerar C2885 de erro do compilador. Para resolver totalmente qualificar as referências a tipos aninhados, coloque o tipo de um espaço para nome ou criar um typedef.Essa alterar foi feita por motivos de conformidade, para tornar o código mais portátil.

  • Compilador não permite const_cast a para baixo para projeção em /clr:oldSyntax
    Antes para Visual C++ 2005 o compilador do Visual C++ permitido a const_cast Operador para baixo de conversão durante a compilação de código-fonte que usa gerenciado Extensions para obter a sintaxe do C++. Executar uma conversão para baixo com const_cast Agora resultados em C2440 de erro do compilador. Para resolver, use o operador de conversão correto (para obter mais informações, consulte Projetando uma operadores). Essa alterar foi feita por motivos de conformidade.

  • Compilador não permite a declaração de reenvio de uma enum gerenciado
    Antes para Visual C++ 2005 o compilador do Visual C++ pode encaminhar declarações de enums gerenciado. Agora, declarando e não definir um enum gerenciado durante a compilação de qualquer forma de /clr resultará na C2599 de erro do compilador. Para resolver, sempre defina enums gerenciado na declaração.Essa alterar foi feita porque encaminhar declarações de enums gerenciado não eram sempre garantidas funcione corretamente: o compilador corretamente não é possível identificar o tipo subjacente de enum.Também o padrão C++ não permite declarações de enum.

  • /YX opção do compilador é removida
    /YX gerado suporte automático cabeçalhos pré-compilado. Ele foi usado por padrão do ambiente de desenvolvimento.Se você remover /YX das suas configurações de compilação e substituir com nada, ele pode resultar em compilações mais rápidas. Juntamente com a possibilidade de um comportamento inesperado com /YX, é preferível usar /Yc (criar arquivo de cabeçalho pré-compilados) e /Yu (arquivo de cabeçalho pré-compilados uso), que permitem você mais controlar em cabeçalhos pré-compilados como são usados.

  • /Oa e /Ow Opções do compilador são removidas
    /Ow e /Oa Opções do compilador foram removidas, mas serão ignoradas silenciosamente. Use the noalias or restrict__declspec modifiers to specify how the compiler does aliasing.

  • /Op opção do compilador é removida
    /Op opção do compilador tivesse sido removida. Use /FP (especificar o comportamento de ponto flutuante) em vez disso.

  • /ML e /MLd Opções do compilador foram removidas
    Visual C++ não suporta single-threaded, vinculadas estaticamente o suporte à biblioteca do CRT. Use /MT e /MTd em vez disso. Consulte Bibliotecas de tempo de execução c para obter mais informações.

  • /G3, /G4, /G5, /G6, /G7, e /GB Opções do compilador foram removidas
    O compilador agora usa um modelo combinado que tentar criar o arquivo de saída recomendado para todas as arquiteturas.

  • /Gf foi removido
    Use /GF (eliminar Duplicars seqüências de caracteres) em vez disso. /GF coloca em pool cadeias de caracteres em uma seção somente leitura, que é mais segura do que a seção gravável, onde /Gf adicionado-los.

  • /clr não é compatível com /MT
    Não há nenhum suporte na biblioteca de tempo de execução C estaticamente vincular a um aplicativo gerenciado.Todos os aplicativos gerenciado precisam ser vinculados dinamicamente (/MD).Para obter mais informações sobre as restrições sobre o uso de /clr, consulte / CLR restrições.

  • /GS Agora é ativada por padrão
    Verificação de estouro de buffer está agora ativada por padrão.Você pode ativar a verificação com saturação do buffer**/GS-**. Consulte /GS (Marcar de segurança de buffer) para obter mais informações.

  • /Zc:wchar_t agora em por padrão
    Este é o padrão C++ comportamento; um wchar_t variável padrão será o tipo interno, em vez de um inteiro curto não assinado. Essa alterar interromperá a compatibilidade binária quando o código do cliente está vinculado a bibliotecas que foram compiladas sem /Zc:wchar_t (LNK2019). Nesse caso, use /Zc:wchar_t- Para reverter para o comportamento antigo, não-padrão. Por padrão, essa alterar foi introduzida para criar código compatível.

    For more information, see /Zc:wchar_t (wchar_t É tipo nativo).

  • /Zc:forScope agora em por padrão
    Este é o comportamento padrão C++; código que depende do uso de uma variável declarada em um loop após o para o escopo de loop terminou agora não será compilado.Use /Zc:forScope- Para reverter para o comportamento antigo, não-padrão. Por padrão, essa alterar foi introduzida para criar código compatível.

    For more information, see /Zc:forScope (forçar conformidade para o escopo de loop).

  • Impor o parâmetro de verificação de atributos do Visual C++
    Código que passa chamado atributos para o construtor de atributo entre aspas quando o tipo não é uma seqüência de caracteres e sem as aspas quando o tipo é uma seqüência de caracteres, agora terá C2065 de erro do compilador ou Compilador C4581 de aviso (nível 1). Anteriormente todos sistema autônomo atributos de compilador foram analisados sistema autônomo seqüências de caracteres e se necessário, o compilador inserido sistema autônomo aspas estão falta.Suporte de atributo foi avançado, adicionando o parâmetro de verificação de validação.Isso impedirá que um comportamento inesperado devido a argumentos incorretos para o construtor de atributo.

    Para esta versão você não pode ter uma seqüência de caractere multibyte (MBCS) em qualquer argumento para um atributo que tem uma seqüência de caractere implícita sistema autônomo um argumento, mesmo se a seqüência de caractere está entre aspas (Isso pode resultar em um arquivo .idl corrompido).A solução alternativa é o seguinte:

    #define ARG string_with_MBCS_chars
    [helpstring(ARG)]
    
  • Compilador agora requer a mesma especificação de modelo para várias declarações do mesmo tipo.
    Se você tiver uma declaração de reenvio de um tipo para que você possa criar amigos para esse tipo, por exemplo, a especificação de modelo do tipo deve ser o mesmo em todas as declarações para o tipo.Caso contrário, o compilador emitirá C2990 de erro do compilador.

  • UUID atributo não pode direcionar tipos gerenciado
    The UUID (Atributos C++) atributo foi permitido em um atributo definido pelo usuário usando extensões gerenciadas para C++, mas agora irá gerar C3451 de erro do compilador. Use GuidAttribute em vez disso.

  • alterar de sintaxe para passagem gerenciado arrays para atributos personalizados
    O tipo de matriz não é deduzido da lista de inicialização agregada.O compilador agora requer que você especifique o tipo de matriz, bem sistema autônomo a lista de inicializador.A sintaxe antiga agora resultará em C3104 de erro do compilador. Essa alterar era necessária porque o compilador não pode deduzir o tipo de matriz da lista de inicialização agregada sempre corretamente.

  • Compilador não injetará int sistema autônomo o tipo de padrão sistema autônomo declarações
    Código que não está faltando o tipo em uma declaração será nenhum padrão mais digitar int o compilador gerará C4430 de aviso do compilador ou Compilador C4431 de aviso (nível 4). Padrão C++ não dá suporte a um int padrão e essa alterar irá garantir que você obtenha o tipo que você realmente deseja.

  • dynamic_cast aprimorou a conformidade com o padrão C++.
    A biblioteca de time de execução C agora faz uma verificação de time de execução dynamic_cast para garantir o tipo de time de compilar da expressão que está sendo convertido refere-se a um sub-object pública classe base de qualquer um o tipo de conversão de destino (para projeção de down) ou tipo de objeto derivado de mais (para projeção de cruzada).For more information, see Alterações significativas no dynamic_cast.

  • Um rvalue não pode ser limite a uma referência não-const.
    Um rvalue não pode ser limite a uma referência não-const.Em versões anteriores do Visual C++, foi possível BIND um rvalue a referência não-const em uma inicialização direta.Este código gera agora Compilador C4350 de aviso (nível 1).

  • Tipos de valor não tem um construtor padrão emitido, isso poderá causar inicializadores de tipo para serem executados em diferentes pontos
    Antes para Visual C++ 2005 construtores estático (inicializadores de tipo) em tipos de valor foram executados quando uma instância do tipo de valor foi criada. Para garantir que os construtores estático são executados, acessar um membro de dados estático ou (/clr:oldSyntax Defina um construtor de instância somente). Não fornecer um construtor padrão para tipos de valor foi concluído porque o common linguagem tempo de execução não garante a que ele será sempre chamar um construtor padrão.Além disso, não fornecer um construtor padrão para tipos de valor melhora o desempenho.

  • Tipos de valor convertidos agora são lidos somente em verificável (/clr:safe) contextos.
    O common linguagem tempo de execução não permite mais modificando um tipo de valor convertidos ao compilar um assembly pode ser verificado.O compilador agora oferece C4972 de aviso do compilador Quando isso é detectado.

    C4792 é fornecida somente se você alterar o valor do objeto de valor subjacente através do objeto de valor convertidos.O erro não ocorrerá se você alterar uma cópia do objeto de valor (por exemplo, alterar um objeto de processador in a box)

  • Tipos nativo são privados por padrão, fora do assembly
    Tipos nativo agora não será visíveis fora do assembly por padrão.Para obter mais informações sobre a visibilidade de tipo fora do assembly, consulte Visibility tipo. Essa alterar foi orientada basicamente pelas necessidades de desenvolvedores que usam idiomas de outros, não diferencia maiúsculas de minúsculas, ao fazer referência a metadados criados no Visual C++.

  • /clr agora aceita a nova sintaxe do CLR para Visual C++
    Antes para Visual C++ 2005, /clr compilado gerenciado Extensions para obter a sintaxe do C++. /clr compila agora a nova sintaxe do CLR e. /clr:oldSyntax compila gerenciado Extensions para obter a sintaxe do C++. Para obter mais informações sobre /clr, consulte: o CLR (ComComummon Idioma Tempo de execução ComComumpilation).Para obter mais informações sobre a nova sintaxe, consulte Novo Features Idioma in Visual C++.

  • /clr não mais compila arquivos de código-fonte C
    Antes para Visual C++ 2005, você pode compilar arquivos de código-fonte C com /clr, no entanto isso agora resultará em D8045 de erro de linha de comando. Para resolver, altere a extensão .cpp ou .cxx ou compilar com /TP ou /Tp. Consulte /Tc, /Tp, /TC, /TP (especificar o tipo de arquivo de origem) para obter mais informações.

  • Alterações MSIL ao testar igualdade
    Consulte Como: Testar igualdade para obter mais informações.

Consulte também

Referência

Alterações significativas no compilador Visual C++