智能设备项目的编译器

更新:2007 年 11 月

Visual Studio 包含下列面向智能设备中所使用的微处理器的编译器:

  • 用于编译和链接 32 位 ARM C 和 C++ 程序的 32 位 C/C++ 编译器。

  • 用于编译和链接 32 位 Renesas SH-4 C 和 C++ 程序的 32 位 C/C++ 编译器。

  • 用于编译和链接 MIPS16、MIPS32、MIPS64 C 和 C++ 程序的 C/C++ 编译器。

这些编译器生成通用对象文件格式对象文件。编译器程序每次编译都编译每个源文件,并且还编译一个对象文件(除非另外指定)。编译器中包含有命令行 (CL)、CL 环境变量以及任何指定的响应文件中列出的选项。

Visual Studio 桌面编译器与设备编译器之间的差异

差异

说明

“高级”选项卡,“为结构编译”下拉列表。

设备项目在“C/C++”节点下的“项目属性”的“高级”选项卡的“为结构编译”列表的下拉框中有以下选项:“Arm4 (/QRarch4)”、“ARM5 (/QRarch5)”、“Arm4t (/QRarch4t)”、“ARM5t (/QRarch5t)”。

“高级”选项卡,“使 ARM 和 ARM Thumb 交互工作”下拉列表。

设备项目在“C/C++”节点下的“项目属性”的“高级”选项卡的“使 ARM 和 ARM Thumb 交互工作”列表的下拉框中有以下选项:“是(/QRInterwork-return)”和“否”选项。当设置为“是”时,编译器生成形式转换代码,以使 ARM 16 和 32 位代码交互工作。

“高级”选项卡,“启用浮点模拟”下拉列表。

设备项目在“C/C++”节点下的“项目属性”的“高级”选项卡的“启用浮点模拟”列表的下拉框中有以下选项:“是”和“否”选项。当设置为“是”时,编译器启用浮点操作模拟。

“预处理器”选项卡,“预处理器定义”输入框。

设备项目在“C/C++”节点下的“项目属性”的“预处理器”选项卡的“预处理器定义”输入框中有一个“从父级或项目默认设置继承”复选框和一个用于添加宏的“宏”按钮。

“优化”选项卡,“浮点一致性定义”下拉列表。

设备项目在“C/C++”节点下“项目属性”的“优化”选项卡的“浮点一致性定义”下拉列表中,有用来选择“默认一致性”或“改善一致性(/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 使用的编译器的不同点。

问题

说明

指向成员的指针现在要求使用限定名和 address-of 运算符 (&),并且要求调用函数时必须使用括号。

针对仅使用方法名的早期版本的编译器编写的代码现在将给出编译器错误 C3867 或编译器警告 C4867。此诊断是 ISO C++ 标准所必需的。要创建指向成员函数的指针,必须使用 address-of 运算符 (&) 以及方法的完全限定名。如果不要求 & 运算符和方法的完全限定名,或者函数调用中缺少括号,则可能会导致错误。不带参数列表使用函数名会造成一个函数指针可转换为多种类型。因此,代码可能会在运行时产生意外的行为。

某个类必须可供 friend 声明访问。

对于以前的 Visual C++ 编译器而言,如果某个类在包含友元声明的类的范围内不可访问,则编译器将启用该友元声明。在 Visual C++ 2005 中,这些情况会导致编译器生成编译器错误 C2248。为了解除此错误,应更改在友元声明中指定的类的可访问性。此更改是为了符合 ISO C++ 标准。

不允许将显式专用化作为复制构造函数和复制赋值运算符。

依赖于复制构造函数或复制赋值运算符的显式模板专用化的代码现在将生成编译器错误 C2299。ISO C++ 标准不允许这种用法。此更改是出于符合性方面的考虑,其目的是提高代码可移植性。

不能将非专用化的类模板用作基类列表中的模板参数。

在类定义的基类列表中使用非专用化的模板类名将造成编译器错误 C3203。将非专用化的模板类名用作基类列表中的模板参数是无效的。在将某个模板类型参数用作基类列表中的模板参数时,必须显式地将该模板类型参数添加到模板类名中。此更改是出于符合性方面的考虑,其目的是提高代码可移植性。

不再允许嵌套类型的 using 声明。

具有嵌套类型的 using 声明的代码现在将生成编译器错误 C2885。若要解决此错误,必须完全限定对嵌套类型的引用,将类型放入命名空间中,或者创建 typedef。此更改是出于符合性方面的考虑,其目的是提高代码可移植性。

/YX 编译器选项已被移除。

/YX 编译器选项生成自动的预编译头支持。它是默认从开发环境使用的。如果将 /YX编译器选项从生成配置中移除,有助于加快生成的速度。除了性能问题之外,/YX 编译器选项还带来了发生意外运行时行为的可能性。最好是使用 /Yc“创建预编译头文件”和 /Yu“使用预编译头文件”,这两个选项可以更好地控制预编译头文件的使用方式。

/Oa/Ow 编译器选项已被移除。

/Oa/Ow 编译器选项已被移除,并且将被忽略。请使用 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 循环作用域结束之后使用该 for 循环中声明的某个变量,则此代码将不会编译。可以使用 /Zc:forScope 恢复为原来的非标准行为。引入此更改是为了默认创建具有符合性的代码。

强制对 Visual C++ 属性进行参数检查。

具有以下特点的代码现在将生成编译器错误 C2065 或编译器警告(级别 1)C4581:当类型不是字符串时,在将命名属性传递给属性构造函数时使用引号;当类型是字符串时,在将命名属性传递给属性构造函数时不使用引号。以前,所有编译器属性都被解析为字符串,并且如有必要,编译器将插入缺少的引号。属性支持通过增加参数检查验证而得到增强。此更改将防止由于向属性构造函数传递错误的参数而产生意外行为。

编译器将不会在声明中插入 int 类型作为默认类型。

声明中缺少该类型的代码将不再默认使用 int 类型。编译器将生成编译器警告 C4430 或编译器警告(级别 4)C4431。ISO C++ 标准不支持默认的 int,此更改有助于确保您获得显式指定的类型。

有关更多信息,请参见 Visual C++ 2005 编译器中的重大更改

请参见

其他资源

开发 Visual C++ 设备项目