Oracle® Solaris Studio 12.4:C++ 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

11.7.5 标准头文件实现

C 有 17 个标准头文件(<stdio.h><string.h><stdlib.h> 等)。这些头文件作为 Oracle Solaris 操作系统的一部分提供,位于 /usr/include 目录中。C++ 也有这些头文件,但另外要求在全局名称空间和 std 名称空间中都有各种声明的名称。

C++ 也有另一个版本的各个 C 标准头文件(<cstdio><cstring><cstdlib> 等),仅名称空间 std 中有各种声明的名称。最后,C++ 添加了 32 个自己的标准头文件(<string><utility><iostream> 等)。

标准头文件的明显实现将 C++ 源码中找到的名称用作包括的文本文件的名称。例如,标准头文件 <string>(或 <string.h>)可能指某目录中名为 string(或 string.h)的文件。这种明显实现有以下缺点:

  • 如果头文件没有文件名后缀,则无法仅搜索头文件或为头文件创建 makefile 规则。

  • 如果具有名为 string 的目录或可执行程序,可能会错误地找到该目录或程序而不是标准头文件。

为了解决这些问题,编译器 include 目录会包含一个与头文件同名的文件和一个指向它且具有唯一后缀 .SUNWCChSUNW 是所有编译器相关软件包的前缀,CC 指 C++ 编译器,h 是常用的头文件后缀)的符号链接。 指定 <string> 后,编译器将其重写为 <string.SUNWCCh> 并搜索该名称。后缀名只能在编译器自己的 include 目录中找到。如果这样找到的文件是符号链接(正常情况下),编译器就对链接进行一次引用解除,并将结果(此例中是 string)用作错误消息和调试器引用的文件名。忽略文件的依赖性信息时,编译器使用带后缀的名称。

仅当出现在尖括号中且无需指定任何路径时,17 种标准 C 头文件和 32 种标准 C++ 头文件的两种格式才会发生名称重写。如果使用引号来代替尖括号指定任何路径组件或其他某些头文件,就不会有重写发生。

下表说明了通常的情况。

表 11-3  头文件搜索示例
源代码
编译器搜索
注释
<string>
string.SUNWCCh
C++ 字符串模板
<cstring>
cstring.SUNWCCh
C string.h 的 C++ 版本
<string.h>
string.h.SUNWCCh
C string.h
<fcntl.h>
fcntl.h
不是标准 C 或 C++ 头文件
"string"
string
双引号,不是尖括号
<../string>
../string
指定的路径

如果编译器未找到 header.SUNWCCh,则编译器将重新搜索 #include 指令中提供的名称。例如,如果使用指令 #include <string>,编译器就尝试查找名为 string.SUNWCCh 的文件。如果搜索失败,编译器就查找名为 string 的文件。

11.7.5.1 替换标准 C++ 头文件

由于标准头文件实现中介绍的搜索算法,您无需提供Installing the Replacement Library中介绍的 安装替换库 版本的替换头文件。但是,如果遇到了所描述的某些问题,建议为每个无后缀的头文件添加后缀为 .SUNWCCh 的符号链接。也就是说,对于文件 utility,可以运行以下命令:

example% ln -s utility utility.SUNWCCh

编译器第一次查找 utility.SUNWCCh 时,会找到它,而不会和其他名为 utility 的文件或目录混淆。

11.7.5.2 替换标准 C 头文件

不支持替换标准 C 头文件。如果仍然希望提供标准头文件的自己的版本,那么建议按以下步骤操作:

  • 将所有替换头文件放置在一个目录中。

  • 在该目录中创建指向每个替换头文件的 .SUNWCCh 符号链接。

  • 在每次调用编译器时使用 -I 指令,搜索包含替换头文件的目录。

例如,假设有 <stdio.h><cstdio> 的替换。请将文件 stdio.hcstdio 放在目录 /myproject/myhdr 中。在该目录中,运行以下命令:

example% ln -s stdio.h stdio.h.SUNWCCh
example% ln -s cstdio cstdio.SUNWCCh

每次编译时使用 -I/myproject/mydir 选项。

警告信息:
  • 如果要替换任何 C 头文件,就必须成对替换。例如,如果替换 <time.h>,还应该替换 <ctime>

  • 替换头文件必须与被替换版本具有相同的效果。也就是说,各种运行时库(如 libCrunlibClibCstdlibc)是使用标准头文件中的定义生成的。如果替换文件不匹配,那么程序不能工作。