Поделиться через


Критические изменения в Visual C++

В этом документе приведен перечень изменений в Visual C++ в Visual Studio 2012, которые могут нарушить работу существующего кода.

Компилятор Visual C++

  • В коде, компилироваться с помощью /clr, ключевое слово enum class определяет перечисление A.C. ++11, не перечисление (CLR) среды CLR.Определение перечисления CLR необходимо быть явными о его специальных возможностей.Это показано в приведенном ниже примере.

    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()
            );
    } 
    
  • Используйте ключевое слово template, чтобы явно различать зависимое имя (соответствие языка C, C-++).В следующем примере ключевое слово, выбранного шаблона необходимо, чтобы разрешить неоднозначность.Для получения дополнительной информации см. Разрешение имен для зависимых типов.

    template <typename X, typename AY> struct Container {
        typedef typename AY::template Rebind<X>::Other AX;
    };
    
  • Константное выражение типа float больше не поддерживается как аргумент шаблона, как показано в следующем примере.

    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
    
  • Код, компилироваться с помощью параметра командной строки /GS и имеет - - одн уязвимостью может привести к завершению процесса во время выполнения, как показано в следующем примере псевдокода.

    char buf[MAX];
    int cch;
    ManipulateString(buf, &cch);
    // ...
    buf[cch] = '\0'; // if cch >= MAX, process will terminate
    
  • По умолчанию для архитектуры x86 построений изменена на SSE2; таким образом, компилятор может вывести инструкций SSE и будет использовать регистров XMM для выполнения вычислений с плавающей запятой. Если необходимо отменить к предыдущему расширение функциональности следует использовать флажок компилятора /arch:IA32, чтобы определить архитектуру как IA32.

  • Компилятор может вызвать предупреждения C4703 и C4701, ранее не выполнялось. Компилятор применяет более надежные проверки для использования неинициализированных локальных переменных типа указателя.

  • При создании нового флажок /HIGHENTROPYVA определен компоновщика, Windows 8 обычно приводит к выделения памяти возвращать 64 - адрес.(В Windows 8, этих адресов возвращаемых выделений чаще, чем 2 ГБ). Это может привести к ошибкам усечение указателя в имеющемся коде. По умолчанию этот параметр включен. Чтобы отключить это расширение функциональности, укажите значение /HIGHENTROPYVA:NO.

  • Управляемый компилятор (Visual Basic /C#) также поддерживает /HIGHENTROPYVA для управляемых построений.Однако в этом случае параметр /HIGHENTROPYVA по умолчанию.

Интегрированная среда разработки

  • Следующие шаблоны проекта больше не существует:

    • Приложение Windows Forms

    • Библиотека элементов управления Windows Forms

  • Хотя рекомендуется не создаются приложения Windows Forms в C, ++/CLI поддерживается обслуживание существующих приложений пользовательского интерфейса C ++/CLI.Если необходимо создать приложение Windows Forms или любое другое приложение пользовательского интерфейса .NET, использования C-# или Visual Basic.Используйте C ++/CLI только в целях взаимодействия.

Библиотеки Visual C++

Bb531344.collapse_all(ru-ru,VS.110).gifБиблиотека параллельных шаблонов и библиотеки среды выполнения с параллелизмом

Перечисление SchedulerTypeUmsThreadDefault стали сопоставления.Спецификация UmsThreadDefault выдает предупреждение, если в нерекомендуемом внутренне и сопоставляет значение ThreadScheduler.

Bb531344.collapse_all(ru-ru,VS.110).gifБиблиотека стандартных шаблонов

  • После критических изменений между стандартами C ++98/03 и C ++11, используя заданные аргументы шаблона для вызова make_pair()— как make_pair<int, int>(x, y)— обычно не будет компилироваться в Visual C++ в Visual Studio 2012.Решение всегда вызывать make_pair() без явного шаблона аргумент- как make_pair(x, y).Предоставление явно заданные аргументы шаблона наносит отмена цели функции.Если требуется точного контроля над результирующий тип, используйте pair вместо make_pair— как pair<short, short>(int1, int2).

  • Это критическое изменение между стандартами C ++98/03 и C ++11: Когда неявно преобразовать в значение B a и B неявным образом преобразовываться в C, но не a неявно автомобиля с откидным которой в C, C ++98/03 и действует Visual C++ 2010pair<A, X> для преобразования (неявно или явно) значение pair<C, X>.(Другой тип, x, не соответствующий здесь, и это не относятся к первому типа в пары). Поскольку C ++11 и Visual C++ в Visual Studio 2012, а не могут неявно автомобиля с откидным которой в C, они удаляются из пар преобразование разрешения перегруженных версий.Это изменение положительное для многих сценариях.Например, перегружающ func(const pair<int, int>&) и func(const pair<string, string>&), и вызов func() с pair<const char *, const char *> компилируется с этим изменением.Однако это изменение нарушает код, положился на агрессивных преобразованиях пар.Такой код обычно может быть зафиксирован, выполнив одну часть преобразования точно для примера, путем передачи make_pair(static_cast<B>(a), x) в функцию, ожидающую pair<C, X>.

  • Visual C++ 2010 сымитировало variadic шаблон- для примера, ограничение make_shared<T>(arg1, arg2, argN)— до 10 аргументов, с штемпелевать out перегруженные и специализации с машинным оборудованием препроцессора.В Visual C++ в Visual Studio 2012 это ограничение уменьшено до 5 аргументов, чтобы улучшить время компиляции и памяти компилятора для большинства пользователей.Однако можно задать ограничение предыдущего явного указания _VARIADIC_MAX как 10, для всего проекта.

  • C++11 17.6.4.3 .1 [макрос.] имен/2 запрещает ключевые слова макроса izing - если заголовки библиотеки C C-++ стандартные включены.Теперь заголовки выдают ошибки компилятора при обнаружении ключевые слова - ized макроса.(Определение _ALLOW_KEYWORD_MACROS позволяет такой код компилироваться, но настоятельно рекомендуется обескураживаем то потребление). В виде исключения, макрос - ized new включен по умолчанию, так как заголовки комплексно защищают с помощью #pragma push_macro("new")/#undef new/#pragma pop_macro("new").Указание _ENFORCE_BAN_OF_MACRO_NEW позволяет точно, и предполагает ее имя.

  • Чтобы реализовать различные оптимизации и проверки отладки, реализация C стандартной библиотеки C-++ намеренно бинарную нарушают совместимость между версий Visual Studio (2005, 2008, 2010, 2012).Если библиотека C, C-++ используется стандартная это запрещает комбинации объектных файлов и статических библиотек, компилированы с помощью разных версий в одно бинарный (EXE или DLL) и запрещает передача объектов библиотеки C C-++ стандартных между бинарный, компилированы с помощью разных версий.Смешивание объектных файлов и статических библиотек (с использованием C стандартную библиотеку C-++), которое было компилировано с помощью Visual C++ 2010, и те, которые были компилированы с помощью Visual C++ в Visual Studio 2012 создает ошибки компоновщика о несоответствии _MSC_VER, где _MSC_VER макрос, содержащий основной номер версии компилятора (1700) для Visual C++ в Visual Studio 2012.Эта проверка не может обнаружить DLL смешивание и не может обнаружить комбинации то включает Visual C++ 2008 или более ранних версий.

  • Помимо обнаружения несоответствия _ITERATOR_DEBUG_LEVEL, который был реализован в Visual C++ 2010, Visual C++ в Visual Studio 2012 обнаруживает несоответствия RuntimeLibrary.Эти события происходят, когда параметры компилятора /MT (статический выпуск), /MTd (статическое отладка), /MD (выпуск динамического) и /MDd (динамическое смешаны отладка).

  • operator<(), operator>(), operator<=() и operator>=(), которые ранее были доступны для семейств std::unordered_map и stdext::hash_map контейнеров, хотя их реализации не были фактически полезными.Эти операторы нештатные были удалены в Visual C++ в Visual Studio 2012.Кроме того, реализация operator==() и operator!=() для семейства std::unordered_map были расширены для поддержки семейства stdext::hash_map.(Рекомендуется избегать использования семейства stdext::hash_map в новом коде).

  • C ++11 22.4.1.4 [locale.codecvt] указывает, что codecvt::length() и codecvt::do_length() должны принимать изменяемые параметры stateT&, const stateT& принимает только Visual C++ 2010.Visual C++ в Visual Studio 2012 принимает stateT&, mandated стандартом.Это различие значительно для любого, пытается переопределить виртуальную функцию do_length().

Bb531344.collapse_all(ru-ru,VS.110).gifБиблиотека CRT

  • Куча среды выполнения C (CRT), который используется для new и malloc(), больше не закрытой.Теперь использует отростчатую кучу CRT.Это означает, что не разрушена куча при выгрузке библиотеки DLL, а библиотека DLL, статически привязаны к CRT необходимо убедиться, что память, выделенную кодом DLL очищает до его разгржал.

  • Функция iscsymf() утверждения с отрицательными значениями.

  • Структура threadlocaleinfostruct была изменена, чтобы вместить изменения функций языкового стандарта.

  • Встроенные функции, которые имеют соответствующие CRT, например memxxx(), strxxx() удалены из набора intrin.h.Если включена intrin.h только для этих функций необходимо теперь должны включать соответствующие заголовки CRT.

Bb531344.collapse_all(ru-ru,VS.110).gifMFC и библиотеки ATL

Удаленная поддержка fusion (afxcomctl32.h); поэтому все методы, определенные в afxcomctl32.h были удалены.Файлы заголовка и afxcomctl32.h afxcomctl32.inl удалена.

Изменение имени CDockablePane::RemoveFromDefaultPaneDividier в CDockablePane::RemoveFromDefaultPaneDivider.

Изменение сигнатуры CFileDialog::SetDefExt для использования LPCTSTR; поэтому построения юникода затронуты.

Удалено устаревшее ATL трассировки категории.

Изменение сигнатуры CBasePane::MoveWindow для принятия константное выражение CRect.

Изменение сигнатуры CMFCEditBrowseCtrl::EnableBrowseButton.

Удаленное m_fntTabs и m_fntTabsBold из CMFCBaseTabCtrl.

Добавление параметра для конструкторов CMFCRibbonStatusBarPane.(Параметр по умолчанию, поэтому он источник- не прерывается).

Добавление параметра в конструктор CMFCRibbonCommandsListBox.(Параметр по умолчанию, поэтому он источник- не прерывается).

Удаление API AFXTrackMouse (и связывание proc таймера).Использовать API Win32 TrackMouseEvent.

Добавление параметра в конструктор CFolderPickerDialog.(Параметр по умолчанию, поэтому он источник- не прерывается).

размер структуры CFileStatus был изменен. Член m_attribute отличается от БАЙТА значение DWORD (соответствовать значению, возвращаемый из GetFileAttributes).

CRichEditCtrl и CRichEditView используют MSFTEDIT_CLASS (элемент управления RichEdit 4,1) вместо RICHEDIT_CLASS (управления RichEdit 3,0) в операторах юникода.

Удаленное AFX_GLOBAL_DATA::IsWindowsThemingDrawParentBackground, поскольку он всегда ИСТИНЕН в Windows Vista, Windows 7 и Windows 8.

Удаленное AFX_GLOBAL_DATA::IsWindowsLayerSupportAvailable, поскольку он всегда ИСТИНЕН в Windows Vista, Windows 7 и Windows 8.

Удаленное AFX_GLOBAL_DATA::DwmExtendFrameIntoClientArea.Вызвать API Windows непосредственно в Windows Vista, Windows 7 и Windows 8.

Удаленное AFX_GLOBAL_DATA::DwmDefWindowProc.Вызвать API Windows непосредственно в Windows Vista, Windows 7 и Windows 8.

Переименованным AFX_GLOBAL_DATA::DwmIsCompositionEnabled значение IsDwmCompositionEnabled, чтобы исключить конфликт имен.

Измененные идентификаторы для нескольких таймеров MFC внутренних и перемещены в определениях afxres.h (AFX_TIMER_ID_*).

Изменение сигнатуры метода OnExitSizeMove, чтобы согласиться с макросом ON_WM_EXITSIZEMOVE:

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

Изменение имени и сигнатура OnDWMCompositionChanged чтобы согласиться с макросом ON_WM_DWMCOMPOSITIONCHANGED:

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

Изменение сигнатуры метода OnMouseLeave, чтобы согласиться с макросом ON_WM_MOUSELEAVE:

  • CMFCCaptionBar

  • CMFCColorBar

  • CMFCHeaderCtrl

  • CMFCProperySheetListBox

  • CMFCRibbonBar

  • CMFCRibbonPanelMenuBar

  • CMFCRibbonRichEditCtrl

  • CMFCSpinButtonCtrl

  • CMFCToolBar ReplaceThisText

  • CMFCToolBarComboBoxEdit

  • CMFCToolBarEditCtrl

  • CMFCAutoHideBar

Изменение сигнатуры OnPowerBroadcast чтобы согласиться с макросом ON_WM_POWERBROADCAST:

  • CFrameWndEx

  • CMDIFrameWndEx

Изменение сигнатуры OnStyleChanged чтобы согласиться с макросом ON_WM_STYLECHANGED:

  • CMFCListCtrl

  • CMFCStatusBar

Переименовал внутренний метод FontFamalyProcFonts в FontFamilyProcFonts.

Удаленные множество глобальные статические объекты CString для исключения утечек памяти в некоторых ситуациях (замененных с #defines) и следующие переменные членов класса:

  • 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

Изменение сигнатуры и параметр CKeyboardManager::ShowAllAccelerators удалила разделителя сочетаний клавиш.

Добавлены CPropertyPage::GetParentSheet. в классе CPropertyPage, он вызывает вместо GetParent для получения правильного родительское окно таблицы, которая может быть родительским элементом или окна деда значение CPropertyPage.Можно изменить код для вызова GetParentSheet вместо GetParent.

Фиксированное неуравновешенное #pragma warning (внедрения) в ATLBASE.H, которое вызвало предупреждения быть запрещенным неправильно.Эти предупреждения включены теперь правильно после ATLBASE.H было проанализировано.

Методы D2D-related перемещены из AFX_GLOBAL_DATA в _AFX_D2D_STATE.

  • GetDirectD2dFactory

  • GetWriteFactory

  • GetWICFactory

  • InitD2D

  • ReleaseD2DRefs

  • IsD2DInitialized

  • D2D1MakeRotateMatrix

  • Вместо вызова, например afxGlobalData.IsD2DInitialized, вызов AfxGetD2DState->IsD2DInitialized.

Удалены устаревшие файлы из ATL*.CPP atlmfc \ \. \.

Перемещенной инициализации afxGlobalData к по запросу, а не во время инициализации CRT, удовлетворять требованиям к DllMain.

Добавление метода RemoveButtonByIndex в класс CMFCOutlookBarPane.

Исправлено CMFCCmdUsageCount::IsFreqeuntlyUsedCmd значение IsFrequentlyUsedCmd.

Исправлено несколько экземпляров RestoreOriginalstate в RestoreOriginalState (CMFCToolBar, CMFCMenuBar, CMFCOutlookBarPane).

Удалены неиспользуемые методы из CDockablePane. SetCaptionStyle, IsDrawCaption, IsHideDisabledButtons, GetRecentSiblingPaneInfo и CanAdjustLayout.

Удаленные переменные m_bCaptionText и m_bHideDisabledButtons статического члена CDockablePane.

Добавление метода DeleteString переопределяет значение CMFCFontComboBox.

Удалены неиспользуемые методы из CPane. GetMinLength и IsLastPaneOnLastRow.

Переименованным CPane::GetDockSiteRow(CDockingPanesRow *) значение CPane::SetDockSiteRow.

См. также

Другие ресурсы

Начало работы с Visual C++ в Visual Studio 2012