本章提供有关 Sun Studio C 编译器的基本信息。
请注意当前的 C 编译器发行版中以下新增和更改的功能。
如果应用程序代码包含带参数的函数或使用 _m128/_m64 数据类型的返回值,则编译器在 x86 平台上的 Solaris 操作系统或 Linux 操作系统上创建的目标文件将与以前的编译器版本不兼容。使用 .il 内联函数文件、汇编程序代码或调用这些函数的 asm 内联语句的用户也需要注意这种不兼容性。
针对 x86 处理器 woodcrest、penryn、nehalem、core2 和 SPARC 处理器 ultraT2plus 和 sparc64vii 新增了 -xtarget 值。
针对 x86 体系结构 ssse3、sse4_1、sse4_2 和 SPARC 体系结构 sparcima 新增了 -xarch 值。
针对 SPARC 处理器 sparc64vii、ultraT2plus 新增了 -xchip 值。针对 x86 处理器 core2、penryn、nehalem 新增了 -xchip 值。
-xprofile=collect 和 -xprofile=use 选项为分析多线程、动态链接的应用程序提供了更好的支持。
-xcrossfile=1 选项成为 -xipo=1 选项的别名。-xcrossfile=0 选项不再有任何效果。具体来说,-xcrossfile=1 和 -xcrossfile=0 等效于 -xipo=1。
在 Solaris 平台上,-xpec[=yes| no] 选项生成一个 PEC 二进制文件,该文件可重新编译以用于自动调优系统 (Automatic Tuning System, ATS)。
-Y 选项不接受 i 作为参数。
在 SPARC 平台上,现在对优化级别 -x03 或更高级别隐式启用 -xdepend 选项,并且该选项不再包含在 -fast 选项的扩展中。
OpenMP 3.0 支持包含一个 libmtsk 库。在 Solaris OS 中,缺省情况下 OpenMP 程序与此库链接,而不是与 libmtsk 库链接。
-xannotate[=yes|no](仅限 SPARC 平台)指示编译器创建以后可由诸如 binopt(1) 之类的二进制修改工具转换的二进制文件。
不再接受 -Wi 选项以用于将参数传递给过程间优化器。
-xsb 和 -xsbfast 选项已废弃并已删除
-xcheck 选项中添加了一个新标志 [no%]init_local。
__FUNCTION__ 和 __PRETTY_FUNCTION__ 是预定义标识符,这些标识符包含词法上封闭的函数的名称。它们在功能上等效于 c99 预定义标识符 __func__。当在 -Xs 和 -Xc 模式下编译时,它们在 Solaris 平台上不可用。
在标准 C 中,switch 语句中的 case 标签只能有一个关联值。Sun Studio C 编译器允许使用某些编译器中使用的扩展(称为 case 范围)。
可以省略条件表达式中的第二个操作数。如果第一个操作数在当时为非零,则条件表达式的值就是第一个操作数的值。
对于在只读内存中启用和禁用文本字符串放置的 -features=[no%] conststrings 选项,缺省值为 -features=conststrings,它代替了过时的 -xstrconst 选项。
添加了用于指定预处理程序 include 文件的 -include filename 选项。
预处理程序 ## 运算符的新行为:编译器现在针对未定义的 ## 操作(C 标准,第 3.4.3 节)发出警告诊断,该操作中未定义 ## 结果,当进行预处理时,该结果包含多个标记而不是一个标记(C 标准,第 6.10.3.3(3) 节)。未定义的 ## 运算的结果现在定义为通过预处理串联 ## 操作数所创建的字符串而生成的第一个单独标记。
全局 asm 语句。基本 asm 语句表示为 asm(汇编程序代码);它将给定的汇编程序文本直接发送到汇编文件。在文件作用域声明(而不是在函数作用域声明)的基本 asm 语句称为全局 asm 语句。其他编译器将其称为顶级 asm 语句。
针对 x86 Solaris 平台进行编译时,有一些重要问题值得注意。
传统的 Sun 样式的并行 pragma 在 x86 上不可用。而改用 OpenMP。有关将传统并行化指令转换为 OpenMP 的信息,请参见《Sun Studio 12 Update 1:OpenMP API 用户指南》。
在 -xarch 设置为 sse、sse2、sse2a、sse3 或更高级别的情况下编译的程序必须在提供这些扩展和功能的平台上运行。
从 Solaris 9 4/04 开始的 Solaris OS 发行版在 Pentium 4 兼容的平台上支持 SSE/SSE2。早期版本的 Solaris OS 不支持 SSE/SSE2。如果所运行的 Solaris OS 不支持由 -xarch 选定的指令集,则编译器无法为该指令集生成链接代码。
如果在不同的步骤中进行编译和链接,请始终使用编译器和相同的 -xarch 设置进行链接,以确保链接正确的启动例程。
在 x86 上得到的数值结果可能与在 SPARC 上得到的结果不同,这是由 x86 80 位浮点寄存器造成的。为了最大限度减少这些差异,请使用 -fstore 选项或使用 -xarch=sse2 进行编译(如果硬件支持 SSE2)。
因为内部数学库(例如,sin(x))不同,所以 Solaris 和 Linux 之间的数值结果也会不同。
在 Solaris 系统上,从 Sun Studio 11 开始,使用 Sun Studio 编译器编译的程序二进制文件标记有体系结构硬件标志,用于指示编译的二进制文件所采用的指令集。运行时,会检查这些标记标志以验证该二进制文件是否可以在它尝试在上面执行的硬件上运行。
如果在没有相应功能或指令集扩展的平台上运行不包含这些体系结构硬件标志的程序,则可能会导致段故障或不正确的结果,并且不显示任何显式警告消息。
此警告还会扩展到采用 .il 内联汇编语言函数或 __asm() 汇编程序代码(使用 SSE、SSE2、SSE2a 和 SSE3 以及更新指令和扩展)的程序。
使用 -m32 选项针对 ILP32 32 位模型进行编译。使用 -m64 选项针对 LP64 64 位模型进行编译。
ILP32 模型指定 C 语言 int、long 和 pointer 数据类型均为 32 位。LP64 模型指定 long 和 pointer 数据类型均为 64 位。Solaris 和 Linux OS 还支持 LP64 内存模型下的大型文件和大型数组。
如果使用 -m64 进行编译,则生成的可执行文件仅能在运行 64 位内核的 Solaris OS 或 Linux OS 下的 64 位 UltraSPARC(R) 或 x86 处理器上运行。64 位对象的编译、链接和执行只能在支持 64 位执行的 Solaris 或 Linux OS 上进行。
本书中所用术语 C99 是指 ISO/IEC 9899:1999 C 编程语言。术语 C90 是指 ISO/IEC 9899:1990 C 编程语言。
当您指定 -xc99=all,lib -Xc 时,此编译器在 Solaris 平台上完全遵循 C99 标准。
此编译器还遵循 ISO/IEC 9899:1990(编程语言-C 标准)。
由于此编译器还支持传统的 K&R C(Kernighan 和 Ritchie,即 ANSI 之前的 C),因此便于迁移到 ISO C。
有关 C90 实现特定行为的信息,请参见D.1.17 _Pragma。
有关 C99 特性的更多信息,请参见表 C–6。
C 编译器的自述文件强调了关于编译器的重要信息,其中包括:
在手册印刷之后发现的信息
新特性和更改的特性
软件更正
问题和解决办法
限制和不兼容
Sun Developer Network Sun Studio 门户上提供了针对 Sun Studio 的此发行版以及以前发行版的 C 编译器自述文件,该门户的网址为 http://developers.sun.com/sunstudio/documentation。
联机手册 (man) 页提供了有关命令、函数、子例程的当前文档或此类内容的集合。
您可以通过运行以下命令来显示 C 编译器的手册页:
example% man cc |
在整个 C 文档中,手册页参考以主题名称和手册节编号显示: cc(1) 通过 man cc 进行访问。例如,可在 man 命令中使用 -s 选项来访问 ieee_flags(3M) 指示的其他部分:
example% man -s 3M ieee_flags |
C 编译系统由一个编译器、一个汇编程序和一个链接编辑器组成。cc 命令会自动调用这些组件中的每个组件,除非您使用命令行选项另行指定。
表 A–15 介绍了 cc 的所有可用选项。
下图显示 C 编译系统的组织结构。
组件 |
说明 |
使用说明 |
---|---|---|
预处理程序 |
仅适用于 -Xs |
|
编译器(用于非 Xs 模式的内置预处理程序) | ||
静态同步错误检测 |
(SPARC) |
|
代码优化器 |
-O、-xO2、-xO3、-xO4、-xO5、-fast |
|
汇编程序 | ||
代码生成器、内联函数、汇编程序 |
(SPARC) |
|
过程间优化器 |
(SPARC) |
|
后优化器 |
(SPARC) |
|
中间代码翻译者 |
(x86) |
|
代码生成器 |
(x86) |
|
链接程序 | ||
处理注释部分 |
-mr |
有多种工具可用来帮助您开发、维护和改进 C 程序。本书中介绍了两个与 C 联系最紧密的工具:cscope 和 lint。此外,每个工具均有手册页。