在标准化过程早期,ISO 标准委员会选择包含库函数、宏和头文件作为 ISO C 的一部分。
本节介绍各种保留名称及有关其保留的某些基本原理。最后是一系列规则,遵循这些规则可使程序扫清任何保留名称。
assert.h |
locale.h |
stddef.h |
ctype.h |
math.h |
stdio.h |
errno.h |
setjmp.h |
stdlib.h |
float.h |
signal.h |
string.h |
limits.h |
stdarg.h |
time.h |
大多数实现提供更多头文件,但是严格符合 1990 ISO/IEC 标准的 C 程序只能使用这些头文件。
关于其中某些头文件的内容,其他标准稍有不同。例如,POSIX (IEEE 1003.1) 指定 fdopen 在 stdio.h 中声明。为了允许这两种标准共存,POSIX 要求在包含任何头文件之前对宏 _POSIX_SOURCE 进行 #defined,以保证这些附加名称存在。在其可移植性指南中,X/Open 对其扩展也使用这种宏方案。X/Open 的宏是 _XOPEN_SOURCE。
ISO C 要求标准头文件同时是自给自足和幂等的。标准头文件之前或之后不需要任何其他头文件进行 #included,并且每个标准头文件可多次进行 #included 而不会导致问题。该标准还要求它的头文件只能在安全上下文中进行 #included,以便保证头文件中使用的名称保持不变。
标准进一步限制与其库相关的实现。以前,大多数程序员认为不应该在 UNIX 系统上对他们自己的函数使用 read 和 write 等名称。ISO C 要求实现中的引用仅引入该标准保留的名称。
因此,该标准保留所有可能名称的子集供实现使用。此类名称由标识符组成,标识符以下划线开头,后面是其他下划线或大写字母。此类名称包含与以下常规表达式匹配的所有名称:
_[_A-Z][0-9_a-zA-Z]* |
严格地说,如果程序使用此标识符,其行为不确定。因此,使用 _POSIX_SOURCE(或 _XOPEN_SOURCE)的程序具有不确定的行为。
但是,不确定的行为具有不同的程度。如果在符合 POSIX 标准的实现中使用 _POSIX_SOURCE,则您知道程序的不确定行为包括某些头文件中的某些附加名称,并且该程序仍符合公认的标准。ISO C 标准中的预留漏洞允许实现符合表面上不兼容的规范。另一方面,当遇到 _POSIX_SOURCE 等名称时,不符合 POSIX 标准的实现按任意方式执行。
该标准还保留以下划线开头的所有其他名称,以用于作为常规文件作用域标识符以及作为结构和联合的标记的头文件,但不用于局部作用域。允许以下公共实践:让命名为 _filbuf 和 _doprnt 的函数实现库的隐藏部分。
除了显式保留的所有名称之外,1990 ISO/IEC C 标准还保留(供实现和将来标准使用)与某些模式匹配的名称:
表 6–3 保留供扩展使用的名称
文件 |
保留名称模式 |
---|---|
E[0-9A-Z].* |
|
ctype.h |
(to|is)[a-z].* |
locale.h |
LC_[A-Z].* |
math.h |
当前函数名称 [fl] |
signal.h |
(SIG|SIG_)[A-Z].* |
stdlib.h |
str[a-z].* |
string.h |
(str|mem|wcs)[a-z].* |
在以上列表中,只有在包含相关头文件时,以大写字母开头的名称才是宏并被保留。其余名称可指定函数,不能用于为任何全局对象或函数命名。
可以遵循以下四个简单规则以避免与任何 ISO C 保留名称冲突: