Partilhar via


Alterações significativas do Visual C++

Este documento lista as últimas alterações em Visual C++ no Visual Studio 2012.

Compilador do Visual C++

  • No código que é criado usando /clr, a palavra-chave de enum class define enum de energia AC ++11, não um enum de (CLR) do common language runtime.Para definir um enum CLR, você deve ser explícito sobre sua acessibilidade.O exemplo a seguir demonstra isso.

    enum class ArrivalStatus // C++11 scoped enum
    {
        Late, OnTime, Early
    };
    
    private enum class DepartureStatus // CLR enum (because of explicit accessibility)
    {
        Late, OnTime, Early
    };
    
    void PrintStatus(ArrivalStatus arrival, DepartureStatus departure)
    {
        Console.WriteLine("Departure: {0}, Arrival: {1}", 
            departure.ToString(), 
            arrival.ToString() // ERROR: not a CLR enum; does not support .ToString()
            );
    } 
    
  • Use a palavra-chave de template para desambiguar explicitamente um nome (dependente mesma linguagem padrão C++).No exemplo a seguir, a palavra-chave realçado do modelo é obrigatório para resolver a ambiguidade.Para obter mais informações, consulte Resolução de nomes de tipos dependentes.

    template <typename X, typename AY> struct Container {
        typedef typename AY::template Rebind<X>::Other AX;
    };
    
  • A expressão constante de tipo float é permitida não como um argumento de modelo, conforme mostrado no exemplo o seguir.

    template<float n>
    struct B {};  // error C2762: 'float': illegal type for non-type template parameter 'n'
    
    template<int n>
    struct A {};
    
    A<1.1> a1; // error C2762: 'A': invalid expression as a template argument for 'n'
    A<(int)1.1> a2; // ok
    
  • O código que é criado usando a opção de linha de comando de /GS e que tem fora- - um pela vulnerabilidade pode resultar para processar a finalização em tempo de execução, conforme mostrado no exemplo de pseudocódigo.

    char buf[MAX];
    int cch;
    ManipulateString(buf, &cch);
    // ...
    buf[cch] = '\0'; // if cch >= MAX, process will terminate
    
  • A arquitetura padrão para compilações x86 é alterada para SSE2; como consequência, o compilador pode emitir instruções do SSE, e usar os registros de MMX para executar cálculos de ponto flutuante. Se você deseja reverter para o comportamento anterior, então use a opção de compilador de /arch:IA32 para especificar a arquitetura como IA32.

  • O compilador pode emitir avisos C4703 e C4701 onde não fez anteriormente. O compilador aplica verificações robustas para o uso de variáveis locais não inicializado de tipo ponteiro.

  • Quando o novo sinalizador /HIGHENTROPYVA de vinculador for especificado, Windows 8 normalmente faz com que as alocações de memória retorna um endereço de 64 bits.(Antes de Windows 8, esses endereços com mais freqüência retornados das alocações que foram menos de 2 GB.) Isso pode expor erros de truncamento do ponteiro no código existente. Por padrão, este interruptor está ativado. Para desativar esse comportamento, especifique /HIGHENTROPYVA:NO.

  • O compilador gerenciado (Visual Basic /C#) também suporta /HIGHENTROPYVA para compilações gerenciados.No entanto, nesse caso, a opção de /HIGHENTROPYVA é por padrão.

Ambiente de desenvolvimento integrado

  • Os seguintes modelos de projeto não existem:

    • Aplicativos Windows Forms

    • Biblioteca de Controle de Windows Forms

  • Embora tenhamos recomendemos que você não criar aplicativos de formulários do Windows em C++/CLI, a manutenção de aplicativos existentes de C++/CLI interface de usuário é suportada.Se você tiver que criar um aplicativo de formulários do Windows, ou qualquer outro aplicativo .NET interface do usuário, use C# ou Visual Basic.Use C++/CLI para fins de interoperabilidade somente.

Bibliotecas do Visual C++

Bb531344.collapse_all(pt-br,VS.110).gifA modelos paralela a biblioteca e a biblioteca em tempo de execução de concorrência

A enumeração de SchedulerType de UmsThreadDefault é substituída.A especificação de UmsThreadDefault gera um aviso substituído, e internamente mapas de volta a ThreadScheduler.

Bb531344.collapse_all(pt-br,VS.110).gifBiblioteca padrão de modelo

  • Após uma última alteração entre os padrões C++98/03 e C++11, usando argumentos explícitos de modelo para chamar make_pair()— como em make_pair<int, int>(x, y)— normalmente não compila em Visual C++ no Visual Studio 2012.A solução é chamado sempre make_pair() sem modelo explícito argumento- como em make_pair(x, y).Fornecer argumentos explícitos de modelo falha a finalidade de função.Se você precisar que o controle preciso sobre o tipo resultante, use pair em vez de make_pair— como em pair<short, short>(int1, int2).

  • Outra última alteração entre os padrões C++98/03 e C++11: Quando A é implicitamente conversível a e B a B é implicitamente conversível a C, mas não é implicitamente conversível a C, a C++98/03 e a pair<A, X> permitido Visual C++ 2010 a ser convertida implicitamente () ou explicitamente a pair<C, X>.(O outro o tipo, X, não é de interesse aqui, e isso não é específico para o primeiro em pares.) Porque C++11 e Visual C++ no Visual Studio 2012 detectam que não é implicitamente conversível a C, removem a conversão de pares de resolução de sobrecarga.Esta é uma modificação de para muitos cenários.Por exemplo, sobrecarregar func(const pair<int, int>&) e func(const pair<string, string>&), e chamar func() com pair<const char *, const char *> irá compilar com essa alteração.No entanto, essa alteração interrompe o código que dependia em conversões agressivas de pares.Esse código normalmente pode ser corrigido executando de uma parte de conversão explicitamente- por exemplo, passando make_pair(static_cast<B>(a), x) a uma função que espera pair<C, X>.

  • Visual C++ 2010 simulou variadic modelo- por exemplo, make_shared<T>(arg1, arg2, argN)— anterior para um limite de 10 argumentos, carimbando para fora sobrecargas e especializações com maquinaria pré-processamento.Em Visual C++ no Visual Studio 2012, esse limite é reduzido para 5 argumentos para aumentar o tempo de compilação e consumo de memória do compilador para a maioria dos usuários.No entanto, você pode definir o limite inferior explicitamente definindo _VARIADIC_MAX como 10, Project- amplo.

  • C++11 17.6.4.3 .1 [macro.] de nomes/2 proíbe palavra-chave de macro - izing quando os cabeçalhos padrão da biblioteca C++ são incluídos.Agora os cabeçalhos emissão de erros de compilador se eles detectarem palavra-chave de macro - ized.(Definir _ALLOW_KEYWORD_MACROS permite que esse código compila, mas nós desanimamos fortemente que usam.) Como uma exceção, a macro - ized new é permitida por padrão, porque os cabeçalhos se defendem detalhada usando #pragma push_macro("new")/#undef new/#pragma pop_macro("new").Definir _ENFORCE_BAN_OF_MACRO_NEW faz exatamente o que o nome indica.

  • Para implementar várias otimizações e verificações de depuração, a implementação padrão da biblioteca C++ interrompe intencionalmente compatibilidade binário entre versões do Visual Studio (2005, 2008, 2010, 2012).Quando a biblioteca padrão C++ é usada, essa proíbe combinação de arquivos e as bibliotecas estáticas de objeto que são criados usando versões diferentes em uma opção binária (EXE ou DLL), e proíbe passar objetos de padrões de biblioteca C++ entre os binários que são criados usando versões diferentes.A combinação de arquivos e as bibliotecas estáticas de objeto (usando a biblioteca padrão C++) que foi compilado usando Visual C++ 2010 com aqueles que foram criadas usando Visual C++ no Visual Studio 2012 emite-se erros de vinculador sobre a incompatibilidade de _MSC_VER , onde é o _MSC_VER macro que contém a versão principal de compilador (1700) para Visual C++ no Visual Studio 2012.Essa verificação não pode detectar o DLL que mistura, e não pode detectar a mistura do que envolve Visual C++ 2008 ou anterior.

  • Além de detectar incompatíveis de _ITERATOR_DEBUG_LEVEL , que foi implementado em Visual C++ 2010, Visual C++ no Visual Studio 2012 detecta incompatíveis de RuntimeLibrary.Esses ocorrem quando as opções /MT versão estático (), /MTd estático (depuração), /MD (versão dinâmico), e /MDd de compilador dinâmico (depuração) estão misturadas.

  • operator<(), operator>(), operator<=(), e operator>=() anteriormente estavam disponíveis para as famílias de std::unordered_map e de stdext::hash_map de contêiner, embora suas implementações não são realmente úteis.Esses operadores não diferentes foram removidas em Visual C++ no Visual Studio 2012.Além disso, a implementação de operator==() e operator!=() para a família de std::unordered_map foram estendidas para cobrir a família de stdext::hash_map .(Recomendamos que você evita o uso da família de stdext::hash_map no novo código.)

  • C++11 22.4.1.4 [] locale.codecvt especifica que codecvt::length() e codecvt::do_length() devem tomar modificáveis parâmetros de stateT& , mas Visual C++ 2010 recebe const stateT&.Visual C++ no Visual Studio 2012 leva stateT& como encarregado por padrão.Essa diferença é significativa para qualquer pessoa que está tentando função replace virtual do_length().

Bb531344.collapse_all(pt-br,VS.110).gifBiblioteca do CRT

  • O heap de tempo de execução de CRT C (), que é usado para new e malloc(), não é mais particular.O CRT agora usa o heap do processo.Isso significa que o heap não é destruído quando uma DLL é descarregado, para as dlls que vinculam estaticamente ao CRT devem garantir que a memória que é atribuída pelo código de DLL é limpado antes de descarregar.

  • A função de iscsymf() afirma com valores negativos.

  • A estrutura de threadlocaleinfostruct mudou para acomodar alterações nas funções da localidade.

  • As funções que têm correspondentes intrinsics como memxxx(), strxxx() de CRT são removidas de intrin.h.Se você intrin.h incluído somente para essas funções, agora você deve incluir os cabeçalhos de CRT correspondentes.

Bb531344.collapse_all(pt-br,VS.110).gifBibliotecas MFC e de ATL

Suporte removido da fusão afxcomctl32.h (;) como consequência, todos os métodos que são definidos em afxcomctl32.h foram removidas.Os arquivos de cabeçalho afxcomctl32.h e afxcomctl32.inl foram excluídos.

Alterar o nome de CDockablePane::RemoveFromDefaultPaneDividier a CDockablePane::RemoveFromDefaultPaneDivider.

Alterou a assinatura de CFileDialog::SetDefExt para usar LPCTSTR; como consequência, as compilações Unicode são afetadas.

Categorias obsoletas removidos do rastreamento de ATL.

Alterou a assinatura de CBasePane::MoveWindow para obter um CRectconst.

Alterou a assinatura de CMFCEditBrowseCtrl::EnableBrowseButton.

m_fntTabs removido e m_fntTabsBold de CMFCBaseTabCtrl.

Adicionou um parâmetro para os construtores de CMFCRibbonStatusBarPane .(É um parâmetro padrão, e assim que contém não está quebrando.)

Adicionou um parâmetro para o construtor de CMFCRibbonCommandsListBox .(É um parâmetro padrão, e assim que contém não está quebrando.)

Removeu AFXTrackMouse API (e relacionadas proc o timer).Use TrackMouseEvent API do Win32 em vez disso.

Adicionou um parâmetro para o construtor de CFolderPickerDialog .(É um parâmetro padrão, e assim que contém não está quebrando.)

o tamanho da estrutura deCFileStatus mudou: O membro de m_attribute mudou de BYTE ao dword (para coincidir com o valor retornado de GetFileAttributes).

CRichEditCtrl e o uso MSFTEDIT_CLASS de CRichEditView (controle de RichEdit 4,1) em vez de RICHEDIT_CLASS (controle de RichEdit 3,0) em Unicode compilação.

AFX_GLOBAL_DATA::IsWindowsThemingDrawParentBackground removido porque é sempre TRUE no Windows Vista, Windows 7, Windows 8 e em.

AFX_GLOBAL_DATA::IsWindowsLayerSupportAvailable removido porque é sempre TRUE no Windows Vista, Windows 7, Windows 8 e em.

AFX_GLOBAL_DATA::DwmExtendFrameIntoClientArearemovido.Chame o Windows API diretamente no Windows Vista, Windows 7, Windows 8 e em.

AFX_GLOBAL_DATA::DwmDefWindowProcremovido.Chame o Windows API diretamente no Windows Vista, Windows 7, Windows 8 e em.

AFX_GLOBAL_DATA::DwmIsCompositionEnabled renomeia a IsDwmCompositionEnabled para eliminar a colisão de nome.

Identificadores alterados para um número de temporizadores internos MFC e movidos as definições a afxres.hAFX_TIMER_ID_*().

Alterou a assinatura do método de para OnExitSizeMove de acordo com a macro de ON_WM_EXITSIZEMOVE:

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

Alterar o nome e assinatura de OnDWMCompositionChanged de acordo com para a macro de ON_WM_DWMCOMPOSITIONCHANGED:

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

Alterou a assinatura do método de para OnMouseLeave de acordo com a macro de ON_WM_MOUSELEAVE:

  • CMFCCaptionBar

  • CMFCColorBar

  • CMFCHeaderCtrl

  • CMFCProperySheetListBox

  • CMFCRibbonBar

  • CMFCRibbonPanelMenuBar

  • CMFCRibbonRichEditCtrl

  • CMFCSpinButtonCtrl

  • CMFCToolBar ReplaceThisText

  • CMFCToolBarComboBoxEdit

  • CMFCToolBarEditCtrl

  • CMFCAutoHideBar

Alterou a assinatura de OnPowerBroadcast de acordo com para a macro de ON_WM_POWERBROADCAST:

  • CFrameWndEx

  • CMDIFrameWndEx

Alterou a assinatura de OnStyleChanged de acordo com para a macro de ON_WM_STYLECHANGED:

  • CMFCListCtrl

  • CMFCStatusBar

Renomeou o método interno FontFamalyProcFonts a FontFamilyProcFonts.

CString estático global removido vários objetos para eliminar em algumas situações vazamentos de memória (substituído pelo #defines), e os seguintes variáveis de membro da classe:

  • CKeyBoardManager::m_strDelimiter

  • CMFCPropertyGridProperty::m_strFormatChar

  • CMFCPropertyGridProperty::m_strFormatShort

  • CMFCPropertyGridProperty::m_strFormatLong

  • CMFCPropertyGridProperty::m_strFormatUShort

  • CMFCPropertyGridProperty::m_strFormatULong

  • CMFCPropertyGridProperty::m_strFormatFloat

  • CMFCPropertyGridProperty::m_strFormatDouble

  • CMFCToolBarImages::m_strPngResType

  • CMFCPropertyGridProperty::m_strFormat

Alterou a assinatura de CKeyboardManager::ShowAllAccelerators e removesse o parâmetro do delimitador de aceleração.

CPropertyPage::GetParentSheetadicionado, e a classe de CPropertyPage , chamá-lo em vez de GetParent para obter a janela pai correta de folha, que pode ser o pai ou uma janela da CPropertyPageavô.Você pode ter que alterar seu código para chamar GetParentSheet em vez de GetParent.

Observe desequilibrado fixo de #pragma enviar () em ATLBASE.H, que causou avisos ser desativado incorretamente.Os avisos são ativados agora corretamente após ATLBASE.H foi analisado.

Métodos movidos de D2D-related de AFX_GLOBAL_DATA a _AFX_D2D_STATE:

  • GetDirectD2dFactory

  • GetWriteFactory

  • GetWICFactory

  • InitD2D

  • ReleaseD2DRefs

  • IsD2DInitialized

  • D2D1MakeRotateMatrix

  • Em vez de chamada, por exemplo, afxGlobalData.IsD2DInitialized, chamada AfxGetD2DState->IsD2DInitialized.

Os arquivos obsoletos removidos de ATL*.CPP de atlmfc incluem \ \ \ pastas.

Inicialização movida da afxGlobalData sob demanda em vez no tempo de inicialização do CRT, satisfazer os requisitos de DLLMain.

Adicionou o método de RemoveButtonByIndex a classe de CMFCOutlookBarPane .

CMFCCmdUsageCount::IsFreqeuntlyUsedCmd corrigido a IsFrequentlyUsedCmd.

Corrigir várias instâncias de RestoreOriginalstate a RestoreOriginalState (CMFCToolBar, CMFCMenuBar, CMFCOutlookBarPane).

Métodos não usado removidos de CDockablePane: SetCaptionStyle, IsDrawCaption, IsHideDisabledButtons, GetRecentSiblingPaneInfo, e CanAdjustLayout.

Variáveis estáticas removidos m_bCaptionText e m_bHideDisabledButtonsde membro de CDockablePane .

Adicionou um método de DeleteString de substituição a CMFCFontComboBox.

Métodos não usado removidos de CPane: GetMinLength e IsLastPaneOnLastRow.

CPane::GetDockSiteRow(CDockingPanesRow *) *)renomeia a CPane::SetDockSiteRow.

Consulte também

Outros recursos

Guia de Introdução ao Visual C++ no Visual Studio 2012