在 Oracle Solaris Studio 12.4 中,C++ 编译器支持 C++11,一种新语言和 ABI(Application Binary Interface,应用程序二进制文件接口)。
在 C++ 11 模式下,CC 编译器使用 g++ ABI 和随 Oracle Solaris Studio 提供的 g++ 运行时库版本。对于此发行版,使用 4.8.2 版本的 g++ 运行时库。
ABI 描述生成的对象代码中的低级别详细信息。使用不同 ABI 的模块无法成功链接在一起成为程序。这意味必须在程序中的所有模块上使用 C++11 模式,或者不在任何模块上使用该模式。
如果使用 Oracle Solaris Studio 12.4 C++ 作为对 Oracle Solaris Studio 12.3 (C++ 5.12) 的升级,则不使用 C++11 功能时不需要对脚本或 makefile 进行更改。一个异常是 Rogue Wave Tools.h++ 不可用。有关不再支持的功能的更多信息,请参见Oracle Solaris Studio 12.4:发行说明 中的此发行版中已经删除的功能
要在 C++11 模式下进行编译,请将选项 –std=c++11 添加到 CC 命令行。命令行上的位置并不重要。通过该选项,编译器可以识别 C++11 中的新语言功能,并使用标准库(提供的 g++ 运行时库)的 C++11 版本。除了标记为与 –std=c++11 不兼容的选项,所有其他命令行选项都可以与 C++11 一起使用并具有其通常所有的效果。必须在用于构建库或可执行程序的每个 CC 命令上一致地使用 –std=c++11 选项。
此发行版中的 C++ 编译器具有以下更新版本详细信息。
C++ 5.13
__SUNPRO_CC = 0x5130
编译器版本宏完全大于所有早期发行版,所以 __SUNPRO_CC>=0x5100 等版本比较将继续运行。
具有 -compat=5 的 C++03。
这是与 Oracle Solaris Studio 12.3 发行版中的 C++ 5.12 相同的缺省模式。
Oracle Solaris Studio 12.3 具有以下编译器模式选项:
此选项选择 C++03 和 Sun ABI。这是缺省值。
此选项选择 C++03 和 g++ ABI,使用随编译器提供的 gcc 头和库。在 Oracle Solaris Studio 12.3 中,gcc 运行时库安装在 Oracle Solaris 上的 /usr/sfw/lib 中(如果存在的话)。在此发行版中,将使用随编译器提供的 gcc 运行时库。
该发行版添加了选项 –std=[ c++11 | c++0x | c++03 | sun03],其中选项值定义如下:
此选项选择 C++11 和 g++ ABI,并使用在 Oracle Solaris Studio 12.4 中安装的 g++ 4.8.2 运行时库。
此选项等效于 –std=c++11 选项,为 GCC 兼容性而提供。C++11 标准最初昵称为 C++0x。
此选项等效于 –compat=g 选项。
此选项等效于 –compat=5
-compat=g -compat=5 // OK, -compat=5 is used -std=c++11 -std=c++03 // OK, -std=c++03 is used -std=c++11 -compat=g // always an error -compat=g -std=c++03 // always an error
选择 –xustr=ascii_utf16_ushort 与 C++11 不兼容,不允许使用。
该选项将 U"ASCII_string" 解释为 16 位 Unicode,但对于该语法 C++11 需要 32 位 Unicode。
对于 –std=x 或 –compat=g,不允许使用以下 –library=v 选项:
Cstd
stlport4
stdcxx4
Crun
iostream
需要列出要链接的库时,例如创建共享库时,如果使用 –compat=g 或 –std=x 选项,则按此顺序使用以下选项:
-lstdc++ -lgcc_s -lCrunG3
使用 CC 创建可执行程序时,不应列出这些库,因为 CC 驱动程序将为您列出它们。
有关此发行版中删除的库的信息,请参见Oracle Solaris Studio 12.4:发行说明 中的此发行版中已经删除的功能。
以下命令可用于从模块 main.cc、f1.cc 和 f2.cc 构建可执行程序 myprogram:
% CC -std=c++11 -m32 -O -c main.cc % CC -std=c++11 -m32 -O -c f1.cc f2.cc % CC -std=c++11 -m32 -O main.o f1.o f2.o -o myprogram
如果具有使用较旧版本的 Oracle Solaris Studio 构建 C++ 程序的 Makefile,可以通过以下方法将其转换为构建 C++11 程序:向每个 CC 命令行添加 –std=c++11(通常在 CCFLAGS 和 LFLAGS 宏中)并删除任何不兼容的选项,例如 –compat=5 或 –library=stlport4。有效 C++ 程序在 C++11 模式下编译时通常会在不更改的情况下编译和运行。不过,许多实际的程序有时会偶尔依赖于非标准的编译器行为或扩展。此类代码可能无法在 C++11 模式下编译。