JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  C 编译器介绍

2.  特定于 C 编译器实现的信息

2.1 常量

2.1.1 整型常量

2.1.2 字符常量

2.2 链接程序作用域说明符

2.3 线程局部存储说明符

2.4 浮点,非标准模式

2.5 作为值的标签

2.6 long long 数据类型

2.6.1 输出 long long 数据类型

2.6.2 常见算术转换

2.7 switch 语句中的 case 范围

2.8 断言

2.9 支持的属性

2.10 警告和错误

2.11 Pragma

2.11.1 align

2.11.2 c99

2.11.3 does_not_read_global_data

2.11.4 does_not_return

2.11.5 does_not_write_global_data

2.11.6 dumpmacros

2.11.7 end_dumpmacros

2.11.8 error_messages

2.11.9 fini

2.11.10 hdrstop

2.11.11 ident

2.11.12 init

2.11.13 inline

2.11.14 int_to_unsigned

2.11.15 must_have_frame

2.11.16 nomemorydepend

2.11.17 no_side_effect

2.11.18 opt

2.11.19 pack

2.11.20 pipeloop

2.11.21 rarely_called

2.11.22 redefine_extname

2.11.23 returns_new_memory

2.11.24 unknown_control_flow

2.11.25 unroll

2.11.26 warn_missing_parameter_info

2.11.27 weak

2.12 预定义的名称

2.13 保留 errno 的值

2.14 扩展

2.14.1 _Restrict 关键字

2.14.2 _ _asm 关键字

2.14.3 __inline__inline__

2.14.4 __builtin_constant_p()

2.14.5 __FUNCTION____PRETTY_FUNCTION__

2.15 环境变量

2.15.1 PARALLEL

2.15.2 SUN_PROFDATA

2.15.3 SUN_PROFDATA_DIR

2.15.4 TMPDIR

2.16 如何指定 include 文件

2.16.1 使用 -I- 选项更改搜索算法

2.16.1.1 警告

2.17 在独立式环境中编译

2.18 对 Intel MMX 和扩展的 x86 平台内部函数的编译器支持

3.  并行化 C 代码

4.  lint 源代码检验器

5.  基于类型的别名分析

6.  转换为 ISO C

7.  转换应用程序以适用于 64 位环境

8.  cscope:交互检查 C 程序

A.  按功能分组的编译器选项

B.  C 编译器选项参考

C.  实现定义的 ISO/IEC C99 行为

D.  C99 的功能

E.  实现定义的 ISO/IEC C90 行为

F.  ISO C 数据表示法

G.  性能调节

H.  Oracle Solaris Studio C:K&R C 与 ISO C 之间的差异

索引

2.17 在独立式环境中编译

Oracle Solaris Studio C 编译器支持编译与标准 C 库链接、并在包含标准 C 库和其他运行时支持库的运行时环境中执行的程序。C 标准中为此类环境指明了一个托管环境。而为未提供标准库函数的环境指明了一个独立式环境。

针对于独立式环境,一般情况下 C 编译器不支持编译,因为某些可能从编译代码中调用的运行时支持函数一般仅在标准 C 库中可用。问题是:编译器转换源代码时可能会导致在不包含函数调用的源代码结构中调用运行时支持函数,而这些函数一般在独立式环境中不可用。请看以下示例:

% cat -n lldiv.c
     1    void
     2    lldiv(
     3        long long *x,
     4        long long *y,
     5        long long *z)
     6    {
     7        *z = *x / *y ;
     8    }
% cc -c -m32 lldiv.c
% nm lldiv.o | grep " U "
 0x00000000 U __div64
% cc -c -m64 lldiv.c
% nm lldiv.o | grep " U "

在该示例中,使用 -m32 选项编译源文件 lldiv.c 使其在 32 位平台上运行时,对第 7 行中声明的转换将导致外部引用名为 __div64 的运行时支持函数,并且此函数是 32 位版本的标准 C 库中唯一可使用的函数。

使用 -m64 选项编译同一源文件使其在 64 位平台上运行,编译器将使用目标计算机中的 64 位算法指令集,但其中不包括 64 位版本的标准 C 库中运行时支持函数所需要的指令。

尽管在一般情况下不支持使用 C 编译器将独立式环境视为目标,但在遵从注意事项的情况下可使用此编译器在特定的独立式环境(即 Oracle Solaris 内核和设备驱动程序)中编译代码。

必须写入在 Oracle Solaris 内核中运行的代码(包括设备驱动程序),这样外部函数调用才能引用那些只在内核中可用的函数。要使以上情况成为可能,建议遵从以下准则:

如前所述,在源代码转换后,编译器可能会生成对运行时支持函数的调用。对于 Oracle Solaris 内核,在特定情况下可能被调用的运行时支持函数集要小于一般情况下调用的相应函数集,因为内核不使用浮点/复合类型、数学库函数或与运行时支持库相关联的编译器选项。

下表列出了 C 编译器转换源代码后,可能被调入代码中的运行时支持函数,这些代码是为了能够在 Oracle Solaris 内核中运行而编译的。该表列出了其上的源代码转换生成了调用的平台、被调用函数的名称,以及导致生成函数调用的原结构或编译器功能。仅列出了 64 位平台,因为支持 C 编译器的所有版本的 Solaris 均在 64 位内核中运行。

针对于 32 位指令集进行编译时,可能会因指令集的特定限制而调用特定于其他计算机的支持函数。

表 2-4 运行时支持函数

功能
64 位平台
引用自
__align_cpy_n
SPARC
返回大结构;n 取值为1、2、4、8 或 16
_memcpy
x86
返回大结构
_memcpy
x86 和 SPARC
矢量化
_memmove
x86 和 SPARC
矢量化
_memset
x86 和 SPARC
矢量化

注意:一些内核的版本不提供 _memmove()_memcpy()_memset(),但提供与用户模式例程相似的内核模式例程,例如 memmove()、memcpy()memset()

务必注意,针对 x86 平台编译 Solaris 内核代码时,必须使用选项 -xvector=%none。缺省情况下,C 编译器在 x86 平台上使用 XMM 寄存器生成代码以改善常规用户应用程序的性能,包括不使用 C 浮点运算类型的应用程序。使用 XMM 寄存器不适用于内核代码。

可在《编写设备驱动程序指南》和《SPARC 遵从性定义》(版本 2.4)中找到其他信息。