JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.2:C 用户指南
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 error_messages

2.11.7 fini

2.11.8 hdrstop

2.11.9 ident

2.11.10 init

2.11.11 inline

2.11.12 int_to_unsigned

2.11.13 MP serial_loop

2.11.14 MP serial_loop_nested

2.11.15 MP taskloop

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 OMP_DYNAMIC

2.15.2 OMP_NESTED

2.15.3 OMP_NUM_THREADS

2.15.4 OMP_SCHEDULE

2.15.5 PARALLEL

2.15.6 SUN_PROFDATA

2.15.7 SUN_PROFDATA_DIR

2.15.8 SUNW_MP_THR_IDLE

2.15.9 TMPDIR

2.16 如何指定 include 文件

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

2.16.1.1 警告

2.17 在独立式环境中编译

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.  K&R Solaris Studio C 与 Solaris Studio ISO C 之间的差异

索引

2.17 在独立式环境中编译

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 编译器将独立式环境视为目标,但在遵从注意事项的情况下可使用此编译器在特定的独立式环境(即 Solaris 内核和设备驱动程序)中编译代码。

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

  1. 对于只在用户模式下运行的库,不要包含头文件。

  2. 除非确定内核中存在与标准 C 库或其他用户模式库中相同的函数,否则不要调用这些函数。

  3. 不要使用浮点类型或 C99 复合类型。

  4. 不要使用与运行时支持库相关联的编译选项,例如 -xprofile-xopenmp

    cc(1) 手册页的“文件”一节中介绍了与特定编译器选项关联的可重定位对象文件。相关选项的说明下面介绍了与 C 编译器选项关联的运行时支持库。

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

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

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

功能
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()

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