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


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

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

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

  • Ключевое слово auto имеет новое значение по умолчанию. Поскольку старое значение используется редко, на большинство приложений это изменение не окажет влияния.

  • Введено новое ключевое слово static_assert, которое может вызвать конфликт имен, если в коде уже есть идентификатор с таким именем.

  • Поддержка новой лямбда-нотации исключает поддержку указания в коде GUID без кавычек в атрибуте uuid.

  • .NET Framework 4 вводит концепцию исключений поврежденных состояний — исключений, оставляющих процесс в состоянии неустранимых повреждений. По умолчанию невозможно перехватить исключение поврежденного состояния даже с помощью параметра компилятора /EHa, который перехватывает все прочие исключения.

    Чтобы явно перехватить исключение поврежденного состояния, используйте выражения __try-__except. Или примените атрибут [HandledProcessCorruptedStateExceptions], чтобы включить функцию перехвата исключений поврежденного состояния.

    Это изменение влияет главным образом на системных программистов, которым может потребоваться перехватить исключение поврежденного состояния. Исключения: STATUS_ACCESS_VIOLATION, STATUS_STACK_OVERFLOW, EXCEPTION_ILLEGAL_INSTRUCTION, EXCEPTION_IN_PAGE_ERROR, EXCEPTION_INVALID_DISPOSITION, EXCEPTION_NONCONTINUABLE_EXCEPTION, EXCEPTION_PRIV_INSTRUCTION, STATUS_UNWIND_CONSOLIDATE. Дополнительные сведения об этих исключениях см. в макросе GetExceptionCode.

  • Измененный параметр компилятора /GS предотвращает переполнение буфера более комплексно, чем в предыдущих версиях. Эта версия может включать в стек дополнительные проверки безопасности, которые могут отрицательно сказываться на общей производительности. Используйте ключевое слово __declspec(safebuffers), чтобы указать компилятору на то, что не следует вставлять проверки безопасности для конкретной функции.

  • При одновременном использовании параметров компилятора /GL (оптимизация всей программы) и /clr (компиляция CLR) параметр /GL игнорируется. Это изменение внесено по той причине, что использование сочетания параметров компилятора было малоэффективным. В результате изменения повысилась производительность построения.

  • По умолчанию поддержка триграфов в Visual C++ 2010 отключена. Для включения поддержки триграфов используйте параметр компилятора /Zc:trigraphs. Триграф состоит из двух последовательных вопросительных знаков ("??"), за которыми следует третий уникальный знак. Компилятор заменяет триграф соответствующим знаком пунктуации. Например, компилятор заменяет триграф "??=" на знак '#'. Следует использовать триграфы в файлах ресурсов С, которые используют набор символов, не содержащий подходящего графического представления для некоторых знаков пунктуации.

  • Компоновщик больше не поддерживает оптимизацию для Windows 98. Параметр /OPT (оптимизации) вызывает ошибку во время компиляции, если указать /OPT:WIN98 или /OPT:NOWIN98.

  • Параметры компилятора по умолчанию, указываемые свойствами системы построения RuntimeLibrary и DebugInformationFormat, изменены. По умолчанию эти свойства построения указываются в проектах, созданных с помощью Visual C++ выпусков 7.0–10.0. При миграции проекта, созданного с помощью Visual C++ выпуска 6.0, продумайте, имеет ли смысл указать значения этих свойств.

    В Visual C++ 2010 RuntimeLibrary = MultiThreaded (/MD), а DebugInformationFormat = ProgramDatabase (/Zi). В Visual C++ 9.0 RuntimeLibrary = MultiThreaded (/MT), а DebugInformationFormat = Disabled.

Среда CLR

  • Компиляторы Microsoft C# и Visual Basic теперь могут создавать неосновную сборку взаимодействия (no-PIA). Сборка no-PIA может использовать типы COM без развертывания связанной с ними основной сборки взаимодействия (PIA). При использовании сборок no-PIA, созданных в Visual C# или Visual Basic, необходимо ссылаться на сборку PIA в команде компилятора до ссылки на какие-либо сборки no-PIA, использующие библиотеку.

Проекты Visual C++ и MSBuild

  • Проекты Visual C++ теперь основываются на средстве MSBuild. Следовательно, файлы проекта используют новый формат XML-файла и суффикс файла .vcxproj. Visual C++ 2010 автоматически преобразует файлы проекта более ранней версии Visual Studio в новый формат файла.

    На существующий проект оказывается влияние, если он зависим от ранее использовавшегося средства построения, VCBUILD.exe или файла проекта с суффиксом .vcproj.

  • В более ранних версиях язык Visual C++ поддерживал позднее использование листов свойств. Например, родительская страница свойств может импортировать дочернюю страницу свойств и может использовать переменную, определенную в дочернем элементе, для определения других переменных. Позднее использование позволяет родителю использовать дочернюю переменную еще до импорта дочерней страницы свойств. В Visual C++ 2010 переменная страницы проекта не может быть использована, пока она не определена, потому что MSBuild поддерживает только раннее использование.

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

  • Диалоговое окно завершения приложения теперь не завершает приложение.

    В предыдущих выпусках, когда функция abort() или terminate() завершала коммерческое построение приложения, библиотека времени выполнения языка С отображала сообщение о завершении работы приложения в окне консоли или в диалоговом окне. В сообщении указывалось: "Приложение потребовало от среды выполнения завершить работу ненормальным образом. Для получения дополнительных сведений обратитесь в службу поддержки приложения".

    Сообщение о завершении работы приложения было лишним, поскольку затем операционная система Windows отображала текущий обработчик завершения, которым, как правило, было диалоговое окно отчета об ошибках Windows (Dr. Watson) или отладчик Visual Studio. Начиная с версии Visual Studio 2010, библиотека времени выполнения языка С не отображает это сообщение. Более того, среда выполнения не допускает завершение работы приложения до запуска отладчика.

    Это критическое изменение ощутимо только в том случае, если есть зависимость от прежнего поведения сообщения о завершении приложения.

  • В частности, в Visual Studio 2010 IntelliSense не работает с кодами или атрибутами C++/CLI, команда Найти все ссылки не работает с локальными переменными, а функция "Модель кода" не извлекает имена типов из импортированных сборок и не разрешает типы в их полные имена.

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

  • Класс SafeInt включен в Visual C++ и более нет необходимости в его отдельной загрузке. Это изменение может вызвать трудности, если есть собственный класс с именем "SafeInt".

  • Модель развертывания библиотек больше не использует манифесты для поиска конкретной версии библиотеки динамической компоновки (DLL). Вместо этого имя каждой динамической библиотеки компоновки содержит номер версии, это имя и используется для поиска библиотеки. Дополнительные сведения см. в разделе Развертывание в Visual C++ 2010.

  • В предыдущих версиях Visual Studio можно было перестраивать библиотеки времени выполнения. Visual C++ 2010 больше не поддерживает построение собственных копий файлов библиотеки времени выполнения C.

Библиотека стандартных шаблонов

  • Заголовок <iterator> больше не включается автоматически многими другими файлами заголовков. Вместо этого заголовок необходимо включать явно, если требуется поддержка отдельных итераций, определенных в заголовке <interator>.

  • В заголовке <algorithm> удалены функции checked_* и unchecked_*. В заголовке <iterator> удален класс checked_iterator и добавлен класс unchecked_array_iterator.

  • Удален конструктор CComPtr::CComPtr(int). Конструктор позволял построить объект CComPtr при помощи макроса NULL, но был не нужен и допускал бессмысленные конструкции из ненулевых целых чисел.

    CComPtr может быть построен при помощи макроса NULL, который определен как 0, но допустит ошибку, если будет строиться из целого числа, отличного от 0. Данную проблему можно встретить в ситуациях, описанных следующим псевдокодом.

    pair<X, CComPtr<T>> myVar;
    myVar = make_pair(x, NULL);
    

    Чтобы исправить второе выражение, замените макрос NULL на ключевое слово nullptr.

    myVar = make_pair(x, nullptr)
    
  • Были удалены следующие функции элемента ctype: ctype::_Do_narrow_s, ctype::_Do_widen_s, ctype::_narrow_s, ctype::_widen_s. Если в приложении используется одна или несколько из этих функций-членов, необходимо заменить их на соответствующие небезопасные версии: ctype::do_narrow, ctype::do_widen, ctype::narrow, ctype::widen.

Библиотеки CRT, MFC и ATL

  • Удалена поддержка построения библиотек CRT, MFC и ATL пользователями. Например, отсутствует файл nmake. Однако пользователи по-прежнему имеют доступ к исходному коду этих библиотек. Документ, описывающий параметры MSBuild, используемые корпорацией Майкрософт для построения этих библиотек, вероятно, будет опубликован в блоге группы разработчиков Visual C++.

  • Удалена поддержка MFC для IA64. Однако по-прежнему предоставляется поддержка для CRT и ATL с IA64.

  • В файлах определения модулей (DEF) библиотеки MFC порядковые числа больше не используются многократно. Это изменение означает, что порядковые номера не будут отличаться в дополнительных версиях и будет улучшена двоичная совместимость пакетов обновления и выпусков исправлений QFE.

  • В класс CDocTemplate добавлена новая виртуальная функция. Это функция CDocTemplate::OpenDocumentFile. У предыдущей версии функции OpenDocumentFile было два параметра. У новой версии три параметра. Чтобы класс, производный от CDocTemplate, поддерживал диспетчер перезапуска, в нем должна быть реализована версия с тремя параметрами. Дополнительные сведения об этой функции см. в разделе CDocTemplate::OpenDocumentFile. Новый параметр — bAddToMRU.

Макросы и переменные среды

  • Переменная среды __MSVCRT_HEAP_SELECT больше не поддерживается. Эта переменная среды удалена и замена ей не предусмотрена.

Справочные материалы по ассемблеру Microsoft Macro Assembler

См. также

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

Начало работы с Visual C++ 2010