Oracle® Solaris Studio 12.4:C 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

实现定义的 ISO/IEC C99 行为

C 编程语言标准 ISO/IEC 9899:1999 指定了采用 C 语言编写的程序的格式并确立了程序的解释。但是,此标准会将很多问题保留为实现定义的问题,即,由于编译器与编译器的不同。本章将详细介绍这些方面的内容。这些章节的编号将作为本附录中标题的一部分提供,以便与 ISO/IEC 9899:1999 标准本身进行比较:

  • 每节标题使用与 ISO 标准中相同的小节文本和 letter.number 标识符。

  • 每节都提供了 ISO 标准的要求(前面加一个项目符号),该标准描述了实现应定义的内容。然后在这一要求的后面附上实现的说明。

  • 要获取 9899:1999 ISO C 行为,请指定 -std=c99 标志。

E.1 实现定义的行为 (J.3)

合乎标准的实现需要记录它在该子子句中所列每个区域内的行为选择。下面列出了实现定义的项:

E.1.1 转换 (J.3.1)

  • 如何标识诊断(3.10,5.1.1.3)。

    错误和警告消息具有以下格式:

    filename, line number: message

    其中 filename 是错误或警告所在文件的名称,

    line number 是错误或警告所在行的编号,message 是诊断消息。

  • 空白字符的每个非空序列(换行除外)在转换阶段 3 中保留还是替换为一个空格字符 (5.1.1.2)。

    包含制表符 (\t)、换页 (\f) 或纵向输入 (\v) 的非空字符序列将替换为一个空格字符。

E.1.2 环境 (J.3.2)

  • 在转换阶段 1 中设置物理源文件多字节字符与源字符集之间的映射 (5.1.1.2)。

    对于 ASCII 部分,一个字符中有八位;对于特定于语言环境的扩展部分,一个字符中的位数是八位的倍数,具体取决于语言环境。

  • 在独立式环境中,程序启动时所调用函数的名称和类型 (5.1.2.1)。

    该实现为主机环境。

  • 在独立式环境中终止程序的影响 (5.1.2.1)。

    该实现处于主机环境中。

  • 可以定义 main 函数的替代方式 (5.1.2.2.1)。

    除了标准中定义的 main 函数,没有替代方式可以定义该函数。

  • 为字符串指定的值通过 argv 参数指向主函数 (5.1.2.2.1)。

    argv 是指向命令行参数的指针数组,其中 argv[0] 代表程序名称(如果可用)。

  • 交互式设备的要素 (5.1.2.3)。

    交互式设备是系统库调用 isatty() 为其返回非零值的设备

  • 信号集、信号语义和信号缺省处理 (7.14)。

    下表显示了 signal 函数所识别的每个信号的语义:

表 E-1  signal 函数信号的语义
信号编号
缺省事件
信号的语义
SIGHUP 1
退出
hangup
SIGINT 2
退出
中断(擦除)
SIGQUIT 3
信息转储
退出 (ASCII FS)
SIGILL 4
信息转储
非法指令(找到时不重置)
SIGTRAP 5
信息转储
跟踪陷阱(捕获时不重置)
SIGIOT 6
信息转储
IOT 指令
SIGABRT 6
信息转储
由 abort 使用
SIGEMT 7
信息转储
EMT 指令
SIGFPE 8
信息转储
浮点异常
SIGKILL 9
退出
中止(找不到,也无法忽略)
SIGBUS 10
信息转储
总线错误
SIGSEGV 11
信息转储
段违规
SIGSYS 12
信息转储
系统调用参数错误
SIGPIPE 13
退出
写在管道上,但无读取者
SIGALRM 14
退出
报警时钟
SIGTERM 15
退出
来自中止的软件终止信号
SIGUSR1 16
退出
用户定义信号 1
SIGUSR2 17
退出
用户定义信号 2
SIGCLD 18
忽略
子项状态更改
SIGCHLD 18
忽略
子进程状态更改别名 (POSIX)
SIGPWR 19
忽略
电源故障,重新启动
SIGWINCH 20
忽略
窗口大小更改
SIGURG 21
忽略
紧急套接字条件
SIGPOLL 22
退出
发生了可轮询事件
SIGIO 22
Sigpoll
可能有套接字 I/O
SIGSTOP 23
停止
停止(找不到,也无法忽略)
SIGTSTP 24
停止
来自 tty 的用户停止请求
SIGCONT 25
忽略
停止的进程已继续
SIGTTIN 26
停止
已尝试后台 tty 读取
SIGTTOU 27
停止
已尝试后台 tty 写入
SIGVTALRM 28
退出
虚拟计时器已过期
SIGPROF 29
退出
分析计时器已过期
SIGXCPU 30
信息转储
已超出 cpu 限制
SIGXFSZ 31
信息转储
已超出文件大小限制
SIGWAITING 32
忽略
线程代码不再使用保留的信号
SIGLWP 33
忽略
线程代码不再使用保留的信号
SIGFREEZE 34
忽略
检查点暂停
SIGTHAW 35
忽略
检查点恢复
SIGCANCEL 36
忽略
线程库使用的抵消信号
SIGLOST 37
忽略
资源丢失(记录锁定丢失)
SIGXRES 38
忽略
超过资源控制(请参见 setrctl(2))
SIGJVM1 39
忽略
保留供 Java 虚拟机 1 使用
SIGJVM2 40
忽略
保留供 Java 虚拟机 2 使用
  • SIGFPESIGILLSIGSEGV 之外的信号值与计算异常相对应 (7.14.1.1)。

    SIGILLSIGFPESIGSEGVSIGTRAPSIGBUSSIGEMT(请参见 Table E–1)。

  • signal( sig, SIG_IGN) 等效的信号;在程序启动时执行 (7.14.1.1)。

    SIGILLSIGFPESIGSEGVSIGTRAPSIGBUSSIGEMT(请参见 Table E–1)。

  • 环境名称集以及用来改变 getenv 函数所用环境列表的方法 (7.20.4.5)。

    手册页 environ(5) 中列出了这些环境名称。

  • 系统函数执行字符串的方式 (7.20.4.6)。

    摘自 system(3C) 手册页:

    system() 函数会导致 string 作为输入提供给 shell,如同在终端将 string 作为命令键入一样。调用程序将等待,直到 shell 完成,然后以 waitpid(2) 指定的格式返回 shell 的退出状态。

    如果 string 为空指针,则 system() 会检查 shell 是否存在以及是否处于可执行状态。如果 shell 可用,system() 将返回非零值;否则将返回 0

E.1.3 标识符 (J.3.3)

  • 可能出现在标识符中的附加多字节字符以及它们与通用字符名的对应关系 (6.4.2)。

  • 标识符中有效初始字符的数目 (5.2.4.1, 6.4.2)。

    1023

E.1.4 字符 (J.3.4)

  • 字节中的位数 (3.6)。

    一个字节中有 8 位。

  • 执行字符集成员的值 (5.2.1)。

    源代码字符与执行字符之间映射相同。

  • 为每个标准字母换码序列生成的执行字符集成员的唯一值 (5.2.2)。

表 E-2  标准字母换码序列唯一值
转义序列
唯一值
\a(报警)
7
\b(退格)
8
\f(换页)
12
\n(换行)
10
\r(回车)
13
\t (horizontal tab) - 水平制表符
9
\v (vertical tab) - 垂直制表符
11
  • 将除基本执行字符集成员之外的所有字符存储到其中的 char 对象的值 (6.2.5)。

    它是与分配给 char 对象的字符相关联的低 8 位的数值。

  • 是带符号的 char 还是无符号的 char 与“无格式”char 具有相同的范围、表示形式和行为 (6.2.5, 6.3.1.1)。

    将带符号 char 视为“无格式”char。

  • 源代码字符集成员(用字符常量和文本字符串表示)到执行字符集成员的映射 (6.4.4.4, 5.1.1.2)。

    源代码字符与执行字符之间映射相同。

  • 包含多个字符或包含未映射到单字节执行字符的字符或转义序列的整型字符常量的值 (6.4.4.4)。

    一个多字符常量,它不是具有从每个字符的数值派生的值的转义序列。

  • 包含多个多字节字符或不以扩展执行字符集表示的多字节字符或转义序列的宽字符常量的值 (6.4.4.4)。

    一个多字符宽字符常量,它不是具有从每个字符的数值派生的值的转义序列。

  • 用于将映射到扩展执行字符集成员的单个多字节字符组成的宽字符常量转换为对应的宽字符代码的当前语言环境 (6.4.4.4)。

    LC_ALLLC_CTYPELANG 环境变量指定的有效语言环境。

  • 用于将宽文本字符串转换为对应的宽字符代码的当前语言环境 (6.4.5)。

    LC_ALLLC_CTYPELANG 环境变量指定的有效语言环境。

  • 包含不以执行字符集表示的多字节字符或转义序列的文本字符串的值 (6.4.5)。

    多字节字符的每个字节均形成文本字符串的一个字符,并具有等效于多字节字符中该字节数值的值。

E.1.5 整数 (J.3.5)

  • 实现中存在的任何扩展整型 (6.2.5)。

  • 是否使用符号与大小、2 的补码或 1 的补码来表示带符号整型,以及异常值是陷阱表示还是普通值 (6.2.6.2)。

    带符号整型表示为 2 的补码。异常值是普通值。

  • 与具有相同精度的另一个扩展整型有关的任意扩展整型的级别 (6.3.1.1)。

    不适用于此实现。

  • 当无法以整型的对象表示该值时,将整数转换为带符号整型的结果或由此引发的信号 (6.3.1.3)。

    当整数转换为较短的带符号整型数时,将低阶位从较长的整数复制到较短的带符号整型数中。结果可能为负数。

    当无符号整型数转换为同等长度的带符号整型数时,将低阶位从无符号整型数复制到带符号整型数中。结果可能为负数。

  • 对带符号整型数执行某些按位操作的结果 (6.5)。

    对带符号类型应用按位操作的结果是操作数的按位操作,包括符号位。因此,当且仅当两个操作数中每个对应的位均已置位时,结果中的每个位才置位。

E.1.6 浮点 (J.3.6)

  • 浮点运算的准确度以及返回浮点结果的 <math.h><complex.h> 中库函数的准确度 (5.2.4.2.2)。

    浮点运算的准确度与 FLT_EVAL_METHOD 的设置一致。 <math.h><complex.h> 中库函数的准确度在 libm(3LIB) 手册页中进行指定。

  • FLT_ROUNDS 的非标准值为特征的舍入行为 (5.2.4.2.2)。

    不适用于此实现。

  • FLT_EVAL_METHOD 的非标准负值所具有的计算方法 (5.2.4.2.2)。

    不适用于此实现。

  • 当整数转换为不能精确表示原始值的浮点数时的舍入方向 (6.3.1.4)。

    它将接受主要的舍入方向模式。

  • 当浮点数转换为较窄的浮点数时的舍入方向 (6.3.1.5)。

    它将接受主要的舍入方向模式。

  • 如何为某些浮点常量选择最接近的可表示值或与最接近的可表示值接近的较大或较小的可表示值 (6.4.4.2)。

    浮点常量始终舍入为最接近的可表示值。

  • FP_CONTRACT pragma 未禁止浮点表达式时,是否以及如何规定浮点表达式 (6.5)。

    不适用于此实现。

  • FENV_ACCESS pragma 的缺省状态 (7.6.1)。

    对于 -fsimple=0,其缺省值为 ON。否则,对于 -fsimple 的所有其他值,FENV_ACCESS 的缺省值为 OFF

  • 其他浮点异常、舍入模式、环境、分类及其宏名称 (7.6, 7.12)。

    不适用于此实现。

  • FP_CONTRACT pragma 的缺省状态 (7.12.2)。

    对于 -fsimple=0,其缺省值为 OFF。否则,对于 -fsimple 的所有其他值,FP_CONTRACT 的缺省值都为 ON

  • 当实际舍入的结果与符合 IEC 60559 要求的实现中的数学结果不相等时,是否产生“不精确”的浮点异常 (F.9)。

    结果无法确定。

  • 当结果很小,但在符合 IEC 60559 要求的实现中很精确时,是否产生下溢(及“不精确”)的浮点异常 (F.9)。

    当禁用对下溢的捕获时(缺省设置),在这种情况下硬件不会产生下溢或不精确。

E.1.7 数组和指针 (J.3.7)

  • 将指针转换为整数或 64 位的结果,或者将整数或 64 位转换为指针的结果 (6.3.2.3)。

    在转换指针和整数时,位模式不会更改。当结果无法以整数或指针类型表示时除外,此时结果未定义。

  • 减去指向同一个数组元素的两个指针所得结果的大小 (6.5.6)。

    stddef.h 中定义的 int。对于 -m64 为 long。

E.1.8 提示 (J.3.8)

  • 使用寄存器存储类说明符建议的程度是有效的 (6.7.1)。

    有效寄存器声明数取决于每个函数内使用和定义的模式,并受可供分配的寄存器数的限制。不要求编译器和优化器接受寄存器声明。

  • 使用 inline 函数说明符建议的程度是有效的 (6.7.4)。

    只有在使用优化功能时,并且只有在优化器确定进行内联有益时,inline 关键字才能有效对代码进行内联。有关优化选项的列表,请参见优化和性能选项

E.1.9 结构、联合、枚举和位字段 (J.3.9)

  • “无格式”int 位字段是视为 signed int 位字段还是视为 unsigned int 位字段(6.7.2、6.7.2.1)。

    视为 unsigned int

  • _Boolsigned intunsigned int 之外其他允许的位字段类型 (6.7.2.1)。

    可将位字段声明为任何整型。

  • 位字段是否可以跨存储单元边界 (6.7.2.1)。

    位字段不可以跨存储单元边界。

  • 单元中位字段的分配顺序 (6.7.2.1)。

    在存储单元中从高阶到低阶分配位字段。

  • 非位字段结构成员的对齐 (6.7.2.1)。除非一个实现编写的二进制数据由另一个实现来读取,否则不会出现任何问题。

表 E-3  结构成员的填充和对齐
类型
对齐边界
字节对齐
char_Bool
字节
1
short
半字
2
int
4
long -m32
4
long -m64
双字
8
float
4
double -m64
双字
8
double (SPARC) -m32
双字
8
double (x86) -m32
双字
4
long double (SPARC) -m32
双字
8
long double (x86) -m32
4
long double -m64
四倍长字
16
pointer -m32
4
pointer -m64
四倍长字
8
long long —m64
双字
8
long long (x86) -m32
4
long long (SPARC) -m32
双字
8
_Complex float
4
_Complex double -m64
双字
8
_Complex double (SPARC) -m32
双字
8
_Complex double (x86) -m32
双字
4
_Complex long double -m64
四倍长字
16
_Complex long double (SPARC) -m32
四倍长字
8
_Complex long double (x86) -m32
四倍长字
4
_Imaginary float
4
_Imaginary double -m64
双字
8
_Imaginary double (x86) -m32
双字
4
_Imaginary (SPARC) -m32
双字
8
_Imaginary long double (SPARC) -m32
双字
8
_Imaginary long double -m64
四倍长字
16
_Imaginary long double (x86) -m32
4
  • 与每种枚举类型兼容的整型 (6.7.2.2)。

    这是 int

E.1.10 限定符 (J.3.10)

  • 访问具有 volatile 限定类型的对象的要素 (6.7.3)。

    对象名称的每个引用构成对该对象的访问。

E.1.11 预处理指令 (J.3.11)

  • 如何将这两种头名称形式表示的序列映射到头文件或外部源文件名称 (6.4.7)。

    源文件字符映射至其相应的 ASCII 值。

  • 控制条件包含的常量表达式中字符常量的值是否与执行字符集内相同字符常量的值匹配 (6.10.1)。

    预处理指令中的字符常量与其在任何其他表达式中的数值相同。

  • 控制条件包含的常量表达式中单字符字符常量的值是否可以有负值 (6.10.1)。

    此上下文中的字符常量可以有负值。

  • 搜索空格以查找包括的以 < > 分隔的头文件,并确定如何使用空格来指定其他头文件 (6.10.2)。

    头文件的位置取决于在命令行上指定的选项,以及 #include 指令所在的文件。有关更多信息,请参见如何指定 include 文件

  • 如何在指定源文件中搜索包括的以 " " 分隔的头文件 (6.10.2)。

    头文件的位置取决于在命令行上指定的选项,以及 #include 指令所在的文件。有关更多信息,请参见如何指定 include 文件

  • #include 指令中预处理标记(可能由宏扩展生成)合并为头文件名称所使用的方法 (6.10.2)。

    构成头文件名称的所有标记(包括空白)都被视为搜索头文件时使用的文件路径,如如何指定 include 文件中所述。

  • #include 处理的嵌套限制 (6.10.2)。

    编译器不施加任何限制。

  • # 运算符是否在字符常量或文本字符串中位于通用字符名称开头的 \ 字符之前插入 \ 字符 (6.10.3.2)。

    不可以。

  • 每个已识别的非 STDC #pragma 指令的行为 (6.10.6)。

    有关每个已识别的非 STDC Pragma 指令的行为说明,请参见Pragmas

  • 当转换的日期和时间不可用时,__DATE____TIME__ 各自的定义 (6.10.8)。

    环境中总是提供这些宏。

E.1.12 库函数 (J.3.12)

  • 独立式程序可用的任何库工具,子句 4 要求的最低设置除外 (5.1.2.1)。

    该实现处于主机环境中。

  • 断言宏打印的诊断格式 (7.2.1.1)。

    诊断的结构如下:

    Assertion failed: statement. file filename, line number, function name

    statement 是使断言失败的语句。filename__FILE__ 的值。line number__LINE__ 的值。function name__func__ 的值。

  • fegetexceptflag 函数存储的浮点状态标志的表示法 (7.6.2.2)。

    fegetexceptflag 存储在状态标志中的每个异常均可扩展至具有值的整型常量表达式,这样,所有常量组合的按位包括 OR 会得到不同的值。

  • feraiseexcept 函数除了“上溢”或“下溢”浮点异常之外,是否会产生“不精确”浮点异常 (7.6.2.3)。

    不,不会产生“不精确”异常。

  • 除 "C" 和 "" 之外可以作为第二个参数传递给 setlocale 函数的其他字符串 (7.11.1.1)。

    故意留空。

  • FLT_EVAL_METHOD 宏的值小于零或大于 2 时针对 float_tdouble_t 定义的类型 (7.12)。

    • 对于 SPARC,类型如下:

      typedef float float_t;

      typedef double double_t;

    • 对于 x86,类型如下:

      typedef long double float_t;

      typedef long double double_t;

    数学函数的域错误,与此国际标准的要求不同 (7.12.1)。

    如果输入参数为 0、+/-InfNaNilogb()、ilogbf() 和 ilogbl() 会生成无效的异常。

  • 发生域错误时数学函数返回的值 (7.12.1)。

    在发生域错误时返回的值,将遵循 ISO/IEC 9899:1999 编程语言 C 附件 F 中的规定。

  • 发生下溢范围错误时数学函数返回的值:当整型表达式 math_errhandling & MATH_ERRNO 为非零时是否将 errno 设置为宏 ERANGE 的值,以及当整型表达式 math_errhandling & MATH_ERREXCEPT 为非零时是否产生“下溢”浮点异常。(7.12.1).

    对于下溢范围错误: 如果该值可表示为非正规数,则返回非正规数;否则根据情况返回 +-0。

    至于当整型表达式 math_errhandling & MATH_ERRNO 为非零时是否将 errno 设置为宏 ERANGE 的值,由于在我们的实现中 (math_errhandling & MATH_ERRNO) == 0,因此不会应用这一部分。

    当整型表达式 math_errhandling & MATH_ERREXCEPT 为非零时是否会产生“下溢”浮点异常 (7.12.1),如果在发生浮点下溢的同时伴随着准确度的降低,则会产生异常。

  • fmod 函数还有一个参数为零时,发生域错误还是返回零 (7.12.10.1)。

    发生域错误。

  • 在减小商时 remquo 函数使用的以 2 为基数的模数对数 (7.12.10.3)。

    31.

  • 在调用信号处理程序之前是否执行 signal(sig, SIG_DFL); 的等效函数,如果不执行,则阻塞执行的信号 (7.14.1.1)。

    在调用信号处理程序之前执行 signal(sig, SIG_DFL); 的等效函数。

  • 宏 NULL 扩展到的空指针常量 (7.17)。

    NULL 扩展到 0。

  • 文本流的最后一行是否需要一个终止换行符 (7.19.2)。

    最后一行不需要以换行符结束。

  • 写出到换行符前面的文本流中的空格字符在读入时是否出现 (7.19.2)。

    读该流时,所有字符均出现。

  • 可附加至写入二进制流的数据的空字符数 (7.19.2)。

    空字符不附加至二进制流。

  • 附加模式流的文件位置指示符最初位于文件开头还是结尾 (7.19.3)。

    文件位置指示符最初位于文件结尾。

  • 对文本流的写操作是否导致关联的文件在该点之后被截断 (7.19.3)。

    对文本流的写操作不会导致文件在该点之后被截断,除非硬件设备强制这种情况发生。

  • 文件缓冲的特征 (7.19.3)。

    除标准错误流 (stderr) 之外,输出流在输出至文件时采用缺省缓冲,在输出至终端时采用行缓冲。标准错误输出流 (stderr) 在缺省情况下不缓冲。

    缓冲的输出流保存多个字符,然后将这些字符作为块进行写入。未缓冲的输出流将信息排队,以便立即在目标文件或终端上写入。行缓冲的输出将输出的每行排队,直至行完成(请求换行符)时为止。

  • 零长度文件是否确实存在 (7.19.3)。

    由于零长度文件有目录项,因此它确实存在。

  • 书写有效文件名的规则 (7.19.3)。

    有效文件名的长度可以为 1 到 1,023 个字符,并且可以使用除字符 null 和 /(斜杠)之外的所有字符。

  • 同一文件是否可以同时打开多次 (7.19.3)。

    同一文件可以多次打开。

  • 文件中多字节字符所用编码的性质和选项 (7.19.3)。

    对于每个文件来说,多字节字符所用的编码均相同。

  • remove() 函数对打开的文件的影响 (7.19.4.1)。

    在执行关闭文件的最后一个调用时删除文件。程序不能打开已删除的文件。

  • 在调用 rename 函数之前已存在具有新名称的文件时的影响 (7.19.4.2)。

    如果该文件存在,则将其删除,并且新文件改写先前存在的文件。

  • 程序异常终止后是否删除打开的临时文件 (7.19.4.3)。

    如果在文件创建与解除链接这段时期内终止进程,则可能会留下永久文件。请参见 freopen(3C) 手册页。

  • 允许模式进行哪些更改(如果有),并且在什么情况下允许更改 (7.19.5.4)。

    允许模式进行以下更改,具体取决于流下面的文件描述符的访问模式:

    • 指定 + 后,文件描述符模式必须为 O_RDWR

    • 指定 r 后,文件描述符模式必须为 O_RDONLYO_RDWR

    • 指定 a 或 w 后,文件描述符模式必须为 O_WRONLYO_RDWR

      请参见 freopen(3C) 手册页。

    用于打印无穷大或 NaN 的样式,以及为 NaN 打印的任何 n-char 或 n-wchar 序列的含义 (7.19.6.1, 7.24.2.1)。

    [-]Inf, [-]NaN.具有 F 转换说明符时,则为 [-]INF, [-]NAN。

  • fprintffwprintf 函数中 %p 转换的输出(7.19.6.1、7.24.2.1)。

    %p 的输出与 %x 的相同。

  • fscanf() 或 fwscanf() 函数中 %[ 转换的扫描列表中,当 - 字符既不是第一个字符也不是最后一个字符,又不是 ^ 字符为第一个字符时的第二个字符,此时对 - 字符的解释(7.19.6.2、7.24.2.1)。

    如果 - 存在于扫描列表中,并且既不是第一个字符,也不是第二个字符(当第一个字符为 ^ 时),又不是最后一个字符,则表示符合字符的范围。

    请参见 fscanf(3C) 手册页。

  • fscanf() 或 fwscanf() 函数中 %p 转换匹配的序列集合以及相应输入项的解释 (7.19.6.2, 7.24.2.2)。

    匹配与相应 printf(3C) 函数的 %p 转换所生成的序列集合相同的序列集合。相应的参数必须是 void 指针的指针。如果输入项是在执行同一个程序时较早转换的值,则得到的指针将等于该值;否则 %p 转换的行为不确定。

    请参见 fscanf(3C) 手册页。

  • 发生故障时 fgetposfsetposftell 函数将宏 errno 设置为的值(7.19.9.1、7.19.9.3、7.19.9.4)。

    • EBADF 流下面的文件描述符无效。请参见 fgetpos(3C) 手册页。

    • ESPIPE 流下面的文件描述符与管道、FIFO 或套接字相关联。请参见 fgetpos(3C) 手册页。

    • EOVERFLOW 在类型为 fpos_t 的对象中无法正确地表示文件位置的当前值。请参见 fgetpos(3C) 手册页。

    • EBADF 流下面的文件描述符无效。请参见 fsetpos(3C) 手册页。

    • ESPIPE 流下面的文件描述符与管道、FIFO 或套接字相关联。请参见 fsetpos(3C) 手册页。

    • EBADF 流下面的文件描述符不是打开的文件描述符。请参见 ftell(3C) 手册页。

    • ESPIPE 流下面的文件描述符与管道、FIFO 或套接字相关联。请参见 ftell(3C) 手册页。

    • EOVERFLOW 在类型为 long 的对象中无法正确地表示当前文件偏移。请参见 ftell(3C) 手册页。

    在表示由 strtod()、strtof()、strtold()、wcstod()、wcstof() 或 wcstold() 函数转换的 NaN 的字符串中,任何 n-charn-wchar 序列的含义(7.20.1.3、7.24.4.1.1)。

    未给 n-char 序列赋予特殊意义。

  • 发生下溢时,strtodstrtofstrtoldwcstodwcstofwcstold 函数是否将 errno 设置为 ERANGE(7.20.1.3、7.24.4.1.1)。

    是,发生下溢时将 errno 设置为 ERANGE

  • 当请求的大小为零时,callocmallocrealloc 函数返回空指针还是返回指向已分配对象的指针 (7.20.3)。

    将返回空指针或可传递给 free() 的唯一指针。

    请参见 malloc(3C) 手册页。

  • 调用 abort 或 _Exit 函数时,是刷新具有未写入缓冲数据的开放流、关闭开放流还是删除临时文件(7.20.4.1、7.20.4.4)。

    异常终止处理至少包括 fclose(3C) 对所有开放流的影响。请参见 abort(3C) 手册页。

    关闭开放流,并且不刷新开放流。请参见 _Exit(2) 手册页。

  • abortexit_Exit 函数返回给主机环境的终止状态(7.20.4.1、7.20.4.3、7.20.4.4)。

    abort 可用于 wait(3C) 或 waitpid(3C) 的状态是由 SIGABRT 信号终止的进程状态。请参见 abort(3C)、exit(1) 和 _Exit(2) 手册页。

    exit_Exit 返回的终止状态,具体取决于正在进行的调用进程的父进程。

    如果调用进程的父进程正在执行 wait(3C)、wait3(3C)、waitid(2) 或 waitpid(3C),并且既未设置 SA_NOCLDWAIT 标志,也未将 SIGCHLD 设置为 SIG_IGN,则它会被告知调用进程的终止,并且它可使用状态的低阶八位(即,位 0377)。如果父进程未处于等待状态,则当父进程随后执行 wait()、wait3()、waitid() 或 waitpid() 时可以使用子进程的状态。

  • system 函数在其参数不是空指针时返回的值 (7.20.4.6)。

    采用 waitpid(3C) 指定格式的 shell 的退出状态。

  • 本地时区和夏令时 (7.23.1)。

    本地时区由环境变量 TZ 设置。

  • 可以用 clock_ttime_t 表示的时间的范围和精度 (7.23)。

    clock_ttime_t 的精度是一百万分之一秒。在 x86 和 SPARC-V8 上,该范围是 -2147483647-1 至 4294967295 百万分之一秒。而 SPARC-v9 上的范围为 -9223372036854775807LL-1 到 18446744073709551615。

  • clock 函数的年代 (7.23.2.1)。

    时钟的年代以时钟周期(以程序的起始执行时间为起点)表示。

  • "C" 语言环境中 strftimewcsftime 函数的 %Z 说明符的替换字符串(7.23.3.5、7.24.5.1)。

    时区名称或缩写,如果未确定任何时区,则不使用任何字符。

  • trigonometrichyperbolic、以 e 为基数的指数、以 e 为基数的对数、错误和对数伽玛函数是否或何时在符合 IEC 60559 要求的实现中产生“不精确”的浮点异常 (F.9)。

    当不能准确地表示结果时,通常会产生不精确的异常。即使能准确地表示结果,也可能产生不精确的异常。

  • <math.h> 中的函数是否接受符合 IEC 60559 要求的实现 (F.9) 中的舍入方向模式。

    不尝试对 <math.h> 中的所有函数强制使用缺省舍入方向模式。

E.1.13 体系结构 (J.3.13)

  • 为头文件 <float.h><limits.h><stdint.h> 中指定的宏分配的值或表达式(5.2.4.2、7.18.2、7.18.3)。

    • 下面是可用于 <float.h> 中所指定宏的值或表达式:

      #define CHAR_BIT 8 /* max # of bits in a “char” */
      #define SCHAR_MIN (-128) /* min value of a “signed char” */
      #define SCHAR_MAX 127 /* max value of a “signed char” */
      #define CHAR_MIN SCHAR_MIN /* min value of a “char” */
      #define CHAR_MAX SCHAR_MAX /* max value of a “char” */
      #define MB_LEN_MAX 5
      #define SHRT_MIN (-32768) /* min value of a “short int” */
      #define SHRT_MAX 32767 /* max value of a “short int” */
      #define USHRT_MAX 65535 /* max value of “unsigned short int” */
      #define INT_MIN (-2147483647-1) /* min value of an “int” */
      #define INT_MAX 2147483647 /* max value of an “int” */
      #define UINT_MAX 4294967295U /* max value of an “unsigned int” */
      #define LONG_MIN (-2147483647L-1L)
      #define LONG_MAX 2147483647L /* max value of a “long int” */
      #define ULONG_MAX 4294967295UL /* max value of “unsigned long int” */
      #define LLONG_MIN (-9223372036854775807LL-1LL)
      #define LLONG_MAX 9223372036854775807LL
      #define ULLONG_MAX 18446744073709551615ULL
      
      #define FLT_RADIX 2
      #define FLT_MANT_DIG 24
      #define DBL_MANT_DIG 53
      #define LDBL_MANT_DIG 64
      
      #if defined(__sparc)
      #define DECIMAL_DIG 36
      #elif defined(__i386)
      #define DECIMAL_DIG 21
      #endif
      #define FLT_DIG 6
      #define DBL_DIG 15
      #if defined(__sparc)
      #define LDBL_DIG 33
      #elif defined(__i386)
      #define LDBL_DIG 18
      #endif
      
      #define FLT_MIN_EXP (-125)
      #define DBL_MIN_EXP (-1021)
      #define LDBL_MIN_EXP (-16381)
      
      #define FLT_MIN_10_EXP (-37)
      #define DBL_MIN_10_EXP (-307)
      #define LDBL_MIN_10_EXP (-4931)
      
      #define FLT_MAX_EXP (+128)
      #define DBL_MAX_EXP (+1024)
      #define LDBL_MAX_EXP (+16384)
      
      #define FLT_EPSILON 1.192092896E-07F
      #define DBL_EPSILON 2.2204460492503131E-16
      
      #if defined(__sparc)
      #define LDBL_EPSILON 1.925929944387235853055977942584927319E-34L
      #elif defined(__i386)
      #define LDBL_EPSILON 1.0842021724855044340075E-19L
      #endif
      
      #define FLT_MIN 1.175494351E-38F
      #define DBL_MIN 2.2250738585072014E-308
      
      #if defined(__sparc)
      #define LDBL_MIN 3.362103143112093506262677817321752603E-4932L
      #elif defined(__i386)
      #define LDBL_MIN 3.3621031431120935062627E-4932L
      #endif
    • 下面是在 <limits.h> 中所指定宏的值或表达式:

      #define INT8_MAX (127)
      #define INT16_MAX (32767)
      #define INT32_MAX (2147483647)
      #define INT64_MAX (9223372036854775807LL)
      
      #define INT8_MIN (-128)
      #define INT16_MIN (-32767-1)
      #define INT32_MIN (-2147483647-1)
      #define INT64_MIN (-9223372036854775807LL-1)
      
      #define UINT8_MAX (255U)
      #define UINT16_MAX (65535U)
      #define UINT32_MAX (4294967295U)
      #define UINT64_MAX (18446744073709551615ULL)
      
      #define INT_LEAST8_MIN INT8_MIN
      #define INT_LEAST16_MIN INT16_MIN
      #define INT_LEAST32_MIN INT32_MIN
      #define INT_LEAST64_MIN INT64_MIN
      
      #define INT_LEAST8_MAX INT8_MAX
      #define INT_LEAST16_MAX INT16_MAX
      #define INT_LEAST32_MAX INT32_MAX
      #define INT_LEAST64_MAX INT64_MAX
      
      #define UINT_LEAST8_MAX UINT8_MAX
      #define UINT_LEAST16_MAX UINT16_MAX
      #define UINT_LEAST32_MAX UINT32_MAX
      #define UINT_LEAST64_MAX UINT64_MAX
    • 下面是在 <stdint.h> 中所指定宏的值或表达式:

      #define INT_FAST8_MIN INT8_MIN
      #define INT_FAST16_MIN INT16_MIN
      #define INT_FAST32_MIN INT32_MIN
      #define INT_FAST64_MIN INT64_MIN
      
      #define INT_FAST8_MAX INT8_MAX
      #define INT_FAST16_MAX INT16_MAX
      #define INT_FAST32_MAX INT32_MAX
      #define INT_FAST64_MAX INT64_MAX
      
      #define UINT_FAST8_MAX UINT8_MAX
      #define UINT_FAST16_MAX UINT16_MAX
      #define UINT_FAST32_MAX UINT32_MAX
      #define UINT_FAST64_MAX UINT64_MAX
    
    
  • 在任何对象(如果此国际标准中未明确指定)中字节的数值、顺序和编码 (6.2.6.1)。

    本章中其他位置的内容定义了 1999 C 标准中未明确指定的对象的实现定义数值、顺序和编码。

  • sizeof 运算符结果的值 (6.5.3.4)。

    下表列出了 sizeof 的结果。

表 E-4  sizeof 运算符所得到的结果(以字节计)
类型
大小(以字节计)
char_Bool
1
short
2
int
4
long
4
long -m64
8
long long
8
float
4
double
8
long double (SPARC)
16
long double (x86) -m32
12
long double (x86) -m64
16
pointer
4
pointer -m64
8
_Complex float
8
_Complex double
16
_Complex long double (SPARC)
32
_Complex long double (x86) -m32
24
_Complex long double (x86) -m64
32
_Imaginary float
4
_Imaginary double
8
_Imaginary long double (SPARC)
16
_Imaginary long double (x86) -m32
12
_Imaginary long double (x86) -m64
16

E.1.14 语言环境特定的行为 (J.4)

主机环境的以下特征与特定的语言环境有关,并且要求通过该实现将其编制成文档:

  • 基本字符集之外的源代码字符集和执行字符集的附加成员 (5.2.1)。

    特定于语言环境(C 语言环境中无扩展)。

  • 基本字符集之外的执行字符集中附加多字节字符的存在、含义和表示 (5.2.1.2)。

    缺省或 C 语言环境的执行字符集中不存在多字节字符。

  • 用于多字节字符编码的移位状态 (5.2.1.2)。

    无移位状态。

  • 连续打印字符的写入方向 (5.2.2)。

    打印总是从左到右进行。

  • 小数点字符 (7.1.1)。

    特定于语言环境(在 C 语言环境中为 ".")。

  • 打印字符集(7.4,7.25.2)。

    特定于语言环境(在 C 语言环境中为 ".")。

  • 控制字符集(7.4,7.25.2)。

    控制字符集由水平制表符、垂直制表符、换页、报警、退格、回车和换行符组成。

  • isalphaisblankislowerispunctisspaceisupperiswalphaiswblankiswloweriswpunctiswspaceiswupper 函数测试的字符集(7.4.1.2、7.4.1.3、7.4.1.7、7.4.1.9、7.4.1.10、7.4.1.11、7.25.2.1.2、7.25.2.1.3、7.25.2.1.7、7.25.2.1.9、7.25.2.1.10、7.25.2.1.11)。

    有关 isalpha() 和 iswalpha() 的说明以及有关上述相关宏的信息,请参见 isalpha(3C) 和 iswalpha(3C) 手册页。请注意,通过更改语言环境,可以修改其行为。

  • 本机环境 (7.11.1.1)。

    setlocale(3C) 手册页所述,本机环境由 LANGLC_* 环境变量指定。但是,如果未设置这些环境变量,则将本地环境设置为 C 语言环境。

  • 数值转换函数接受的附加主题序列 (7.20.1, 7.24.4.1)。

    基数字符是在程序的语言环境(种类为 LC_NUMERIC)中定义的,并且可能被定义为除句点 (.) 之外的其他值。

  • 执行字符集的整理序列 (7.21.4.3, 7.24.4.4.2)。

    特定于语言环境(C 语言环境中的 ASCII 整理)。

  • strerror 函数设置的错误消息字符串的内容 (7.21.6.2)。

    如果应用程序与 -lintl 相链接,则此函数返回的消息以 LC_MESSAGES 语言环境类别指定的本地语言显示。否则以 C 语言环境中的设置显示。

  • 时间和日期的格式(7.23.3.5,7.24.5.1)。

    特定于语言环境。下面几个表显示 C 语言环境中的格式。

    指定的月份名称如下:

表 E-5  月份名称
1 月
5 月
9 月
2 月
6 月
10 月
3 月
7 月
11 月
4 月
8 月
12 月

指定的周日期名称如下:

表 E-6  周日期及缩写
日期
缩写
星期日 星期四
日 四
星期一 星期五
一 五
星期二 星期六
二 六
星期三

时间的格式为:

%H:%M:%S

日期的格式为:

%m/%d/,带有 -pedantic 标志。

上午和下午的格式为: 上午 下午

  • towctrans 函数支持的字符映射 (7.25.1)。

    程序的语言环境(类别为 LC_CTYPE)中有关字符映射的信息定义了已编码字符集的规则,该规则可能规定了除 tolowertoupper 之外的字符映射。有关可用语言环境及其定义的详细信息,请参阅《Oracle Solaris Internationalization Guide For Developers》。

  • iswctype 函数支持的字符分类 (7.25.1)。

    有关可用语言环境以及任何非标准保留字符分类的详细信息,请参见《Oracle Solaris Internationalization Guide For Developers