Компиляторы для проектов смарт-устройств
Обновлен: Ноябрь 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.