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


Компиляторы для проектов смарт-устройств

Обновлен: Ноябрь 2007

Visual Studio содержит указанные ниже компиляторы, которые предназначены для микропроцессоров, используемых в смарт-устройствах:

  • 32-разрядный компилятор C/C++, используемый для компиляции и привязки 32-разрядных программ ARM C и C++.

  • 32-разрядный компилятор C/C++, используемый для компиляции и привязки 32-разрядных программ Renesas SH-4 C и C++.

  • 32-разрядный компилятор C/C++, используемый для компиляции и привязки программ MIPS16, MIPS32, MIPS64 C и C++.

Компиляторы создают объектные OBJ-файлы в формате COFF. Эти программы компилирует каждый исходный файл и, если не указанно другое, объектный файл для каждой компиляции. Компиляторы обрабатывают параметры, приводимые в командной строке, в переменной среды командной строки и в любом указанном файле ответа.

Отличия компиляторов Visual Studio для настольных компьютеров и для устройств

Различие

Описание

Вкладка Дополнительно, раскрывающийся список Скомпилировать для архитектуры.

Проекты устройств в свойствах проекта, на вкладке Дополнительно, в списке Скомпилировать для архитектуры, в узле C/C++ содержат следующие параметры в раскрывающемся списке: Arm4 (/QRarch4), ARM5 (/QRarch5), Arm4t (/QRarch4t), ARM5t (/QRarch5t).

Вкладка Дополнительно, раскрывающийся список Interwork ARM & ARM Thumb.

Проекты устройств в свойствах проекта, на вкладке Дополнительно, в списке Interwork ARM & ARM Thumb узла C/C++ должны содержать следующие параметры в раскрывающемся списке: Yes (/QRInterwork-return) и параметр NO. Если значение равно yes, компилятор создает код преобразователя для взаимодействия с 16-разрядным и 32-разрядным кодом ARM.

Вкладка Дополнительно, раскрывающийся список Включить эмуляцию для вычислений с плавающей запятой.

Проекты устройств в свойствах проекта, на вкладке Дополнительно, в списке Включить эмуляцию для вычислений с плавающей запятой узла C/C++ должны содержать следующие параметры в раскрывающемся списке: Yes и параметр NO. Если значение равно Yes, компилятор разрешает эмуляцию вычислений с плавающей запятой.

Вкладка PreProcessor, поле ввода PreProcessorDefinitions .

Проекты устройств в свойствах проекта, на вкладке PreProcessor, в поле ввода PreProcessorDefinitions, в узле C/C++ содержат флажок Наследовать от родителя или от значений по умолчанию для проекта и кнопку Макросы для добавления макросов.

Вкладка Оптимизация, раскрывающийся список Floating Point ConsistencyDefinitions .

Проекты устройств в свойствах проекта, на вкладке Оптимизация, в раскрывающемся списке Floating Point ConsistencyDefinitions, в узле C/C++ имеют раскрывающийся список для выбора Default Consistency или Improve Consistency (/Op).

Дополнительные сведения см. в разделе Параметры компилятора в алфавитном порядке.

Изменения по сравнению с предыдущими версиями Visual Studio

Сравнение компиляторов в Visual Studio 2003 и Visual Studio 2005

Так как компиляторы устройств основаны на компиляторе Visual C++ для настольного компьютера, рассмотрение различий между версиями компиляторов для настольных компьютеров даст хорошее понимание различий между компиляторами для устройств eMbedded Visual C++ и компиляторами для устройств Visual Studio 2005. Сведения о различиях между Visual Studio 6.0 и Visual Studio 2003 см. в разделе Compatibility and Compliance Issues in Visual C++.

В следующей таблице приводятся различия компиляторов в Visual Studio 2003 и Visual Studio 2005.

Проблема

Описание

Теперь в вызовах функций указатели на элементы нуждаются в полном имени, операторе извлечения адреса (&) и скобках.

Код, который был написан для более ранних версий компилятора, использовавшего только имя метода, теперь будет приводить к возникновению ошибки компиляции C3867 или предупреждения компиляции C4867. Эта диагностика является требованием стандарта ISO C++. Чтобы создать указатель на функцию-член, необходимо использовать оператор извлечения адреса (&) вместе с полным именем метода. Ошибки могут возникнуть из-за отсутствие требований к наличию оператора & и полного имени метода или же из-за отсутствующих скобок в вызове функции. Использование в указателе имени функции без списка аргументов приводит к созданию указателя функции, конвертируемого в разные типы. Поэтому поведение кода во время выполнения может стать неожиданным.

Класс должен быть доступен для объявления дружественного доступа friend.

Предыдущие компиляторы Visual C++ позволяли объявление дружественного доступа к классу, недоступному в области того класса, который содержит это объявление. В Visual C++ 2005 подобные обстоятельства приведут к созданию компилятором ошибки C2248. Для устранения этой ошибки необходимо изменить доступность класса, указанного в объявлении дружественного доступа. Это изменение было внесено для обеспечения соответствия стандарту ISO C++.

Явная специализация в виде копирования конструктора или копирования оператора присваивания не разрешена.

Код, зависящий от явной специализации шаблона для копирования конструктора или копирования оператора присваивания, теперь вызывает ошибку компилятора C2299. Стандарт ISO C++ не разрешает подобное использование. Данное изменение было внесено в целях обеспечения соответствия, чтобы сделать код более переносимым.

Шаблон неспециализированного класса нельзя использовать в качестве аргумента шаблона в списке базового класса.

Использование имени неспециализированного класса шаблона в списке базового класса для определения класса приведет к возникновению ошибки компилятора C3203. Недопустимо использовать имя неспециализированного класса шаблона в качестве параметра шаблона в списке базового класса. Следует явно добавлять параметры типа шаблона к имени класса шаблона при использовании его в качестве параметра шаблона в списке базового класса. Данное изменение было внесено в целях обеспечения соответствия, чтобы сделать код более переносимым.

Объявление вложенного типа больше не разрешается.

Код, в котором используется объявление вложенного типа, теперь вызывает ошибку компилятора C2885. Чтобы устранить эту ошибку, необходимо полностью определить ссылки на вложенные типы, поместить такой тип в пространство имен или создать определение типа typedef. Данное изменение было внесено в целях обеспечения соответствия, чтобы сделать код более переносимым.

Параметр компилятора /YX удален.

Параметр компилятора /YX служит для создания поддержки автоматически предварительно компилируемых заголовков. Он использовался в среде разработки по умолчанию. Если удалить параметр компилятора /YX из конфигураций построения, построения будут выполняться быстрее. Кроме проблем, связанных с производительностью, параметр компилятора /YX может привести к неожиданному поведению во время выполнения. Рекомендуется использовать параметры /Yc, Создание файла предварительно скомпилированного заголовка и параметр /Yu,Использование файла предварительно скомпилированного заголовка, что предоставляет большие возможности управления использованием предварительно скомпилированных заголовков.

Параметры компилятора /Oa и /Ow удалены.

Параметры компилятора /Ow и /Oa удалены и будут игнорироваться. Для указания метода присвоения псевдонимов при компиляции следует использовать модификаторы noalias и restrictdeclspec.

Параметр компилятора /Op удален.

Параметр компилятора /Op был удален. Вместо него можно использовать /fp:precise.

Параметры компилятора /ML и /MLdбыли удалены.

Visual C++ 2005 уже не поддерживает статически привязанную библиотеку CRT с одним потоком. Вместо нее можно использовать /MT и /MTd.

Параметры компилятора /G3, /G4, /G5, /G6, /G7 и /GB были удалены.

Теперь компилятор теперь использует "смешанную модель", которая пытается создать оптимальный выходной файл для всех архитектур.

Параметр компилятора /Gf был удален.

Можно использовать вместо него параметр /GF. Параметр /Gf помещал строки пула в раздел с возможностью записи, а параметр /GF помещает их в раздел только для чтения, что безопаснее.

Параметр компилятора /GS теперь по умолчанию включен.

Проверка переполнения буфера теперь включена по умолчанию. Ее можно отключить с помощью параметра /GS-.

Переменная /Zc:wchar_t теперь по умолчанию включена.

Это поведение по стандарту ISO C++: для переменной wchar_t по умолчанию устанавливается встроенный тип вместо типа "короткое целое без знака". Это изменение нарушает двоичную совместимость, когда код клиента связывается с библиотеками, скомпилированными без параметра /Zc:wchar_t. Можно с помощью параметра /Zc:wchar_t- вернуться к старому нестандартному поведению. Это изменение было внесено для создания совместимого кода по умолчанию.

Переменная /Zc:forScope теперь по умолчанию включена.

Это поведение по стандарту ISO C++: код, который зависит от использования объявленной в цикле for переменной после окончания этого цикла, вызывает ошибку компилятора. Можно с помощью параметра /Zc:forScope вернуться к старому нестандартному поведению. Это изменение было внесено для создания совместимого кода по умолчанию.

Обеспечена проверки параметров для атрибутов Visual C++.

Код, который передает именованные атрибуты в конструктор атрибутов, используя кавычки, если тип не является строкой, и без кавычек, если тип является строкой, не будет приводить к созданию ошибки компилятора C2065 или предупреждения компилятора (уровень 1) C4581. Ранее все атрибуты компилятора анализировались как строки, и при необходимости компилятор вставлял пропущенные кавычки. С тех пор поддержка атрибутов была улучшена путем добавления проверки параметров. Это изменение препятствует возникновению неожиданного поведения, которое может возникнуть при передаче недопустимых аргументов в конструктор атрибутов.

Компилятор не будет вводить тип int как тип по умолчанию в объявлениях.

Код, в котором не объявлен тип, не будет больше использовать по умолчанию тип int. Компилятор создаст предупреждение компилятора C4430 или предупреждение (уровень 4) C4431. Стандарт ISO C++ не поддерживает тип по умолчанию int. Это изменение гарантирует явному указанию получаемого типа.

Дополнительные сведения см. в разделе Критические изменения в компиляторе Visual C++ 2005.

См. также

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

Разработка проектов устройств Visual C++