2.15.1. ISO C 库实现定义

ISO 规范允许实现者实现某些功能,但要求记录选择的实现。 本节介绍了 ARM 库实现。

在通用 ARM C 库中:

以下函数对 EOF (-1) 至 255(包含这两个值)范围内的字符值进行测试:

库命名约定中列出了 ISO C 库变体。

数学函数

Table 2.14 说明了在提供的参数超出范围时数学函数的响应方式。

Table 2.14. 数学函数 

函数 条件 返回值 错误编号
acos(x) abs(x) > 1 QNaN EDOM
asin(x) abs(x) > 1 QNaN EDOM
atan2(x,y) x =0, y = 0 QNaN EDOM
atan2(x,y) x = Inf, y = Inf QNaN EDOM
cos(x) x=Inf QNaN EDOM
cosh(x) 溢出 +Inf ERANGE
exp(x) 溢出 +Inf ERANGE
exp(x) 下溢 +0 ERANGE
fmod(x,y) x=Inf QNaN EDOM
fmod(x,y) y = 0 QNaN EDOM
log(x) x < 0 QNaN EDOM
log(x) x = 0 -Inf EDOM
log10(x) x < 0 QNaN EDOM
log10(x) x = 0 -Inf EDOM
pow(x,y) 溢出 +Inf ERANGE
pow(x,y) 下溢 0 ERANGE
pow(x,y) x=0 or x=Inf, y=0 +1 EDOM
pow(x,y) x=+0, y<0 -Inf EDOM
pow(x,y) x=-0, y<0 and y integer -Inf EDOM
pow(x,y) x= -0, y<0 and y non-integer QNaN EDOM
pow(x,y) x<0, y non-integer QNaN EDOM
pow(x,y) x=1, y=Inf QNaN EDOM
sqrt(x) x < 0 QNaN EDOM
sin(x) x=Inf QNaN EDOM
sinh(x) 溢出 +Inf ERANGE
tan(x) x=Inf QNaN EDOM
atan(x) SNaN SNaN
ceil(x) SNaN SNaN
floor(x) SNaN SNaN
frexp(x) SNaN SNaN
ldexp(x) SNaN SNaN
modf(x) SNaN SNaN
tanh(x) SNaN SNaN

HUGE_VALInf 的别名。 有关错误编号,请参考 errno 变量。 所有函数在传递 QNaN 时返回 QNaN,在传递 SNaN 时抛出无效运算异常,但Table 2.14 中显示的情况除外。

将S略传递给 C99 nan() 函数的字符串,并且始终返回相同的 NaN,即,清除了最高位以外的所有小数位的 NaN。 还会清除符号位。 将 NAN(xxxx) 格式的字符串传递给 strtod 具有相同的效果。

信号函数

Table 2.15 显示了 signal() 函数支持的信号。

Table 2.15. 信号函数 

信号 编号 说明 附加自变量
SIGABRT 1 仅当应用程序调用 abort()assert() 时,才会使用此信号。
SIGFPE 2 用于发出任何算法异常信号,例如,除以零。 由硬件浮点和软件浮点以及整数除法使用。 来自 {FE_EX_INEXACT, FE_EX_UNDERFLOW, FE_EX_OVERFLOW, FE_EX_DIVBYZERO, FE_EX_INVALID, DIVBYZERO} 的位集合
SIGILL 3 非法指令。
SIGINT 4 来自用户的注意请求。
SIGSEGV 5 内存访问错误。
SIGTERM 6 终止请求。
SIGSTAK 7 检测到堆栈溢出。
SIGRTRED 8 运行时库输入/输出流上的重定向失败。 为重定向标准流而重新打开的文件或设备的名称
SIGRTMEM 9 初始化期间或被破坏后出现堆空间不足。 失败请求的大小
SIGUSR1 10 由用户定义。 由用户定义
SIGUSR2 11 由用户定义。 由用户定义
SIGPVFN 12 从 C++ 中调用纯虚拟函数。 -
SIGCPPL 13 来自 C++ 的异常 -
SIGOUTOFHEAP 14 在出现堆空间不足时由 C++ 函数 ::operator new 返回。 失败请求的大小
保留 15-31 保留。 保留
其他 > 31 由用户定义。 由用户定义

可通过 __raise() 传递编号大于 SIGUSR2 的信号,并由缺省信号处理程序捕获,但不能由使用 signal() 注册的处理程序捕获。

如果试图为编号大于 SIGUSR2 的信号注册处理程序,signal() 将返回一个错误代码。

所有可识别的信号的缺省处理方式是,输出诊断消息并调用 exit()。 程序启动时将应用此缺省行为,直至您更改它时为止。

Caution

适用于浮点处理的 IEEE 754 标准规定,对异常执行的缺省操作是继续运行而不进行捕获。 缺省情况下,浮点计算中产生的异常不生成 SIGFPE。 可通过调整 fenv.h 中的函数和定义来修改浮点错误处理方式。 有关详细信息,请参阅调整错误信号、错误处理和程序退出Chapter 4 浮点支持

对于Table 2.15 中的所有信号,当发出信号时,如果处理程序指向一个函数,则在调用处理程序之前执行 signal(sig, SIG_DFL) 的等效函数。

如果 signal() 函数指定的处理程序收到 SIGILL 信号,则会重置缺省处理。

输入/输出特征

通用 ARM C 库具有以下输入/输出特征:

  • 文本流的最后一行不需要终止换行符。

  • 对于写出到文本流中紧靠换行符前面的空格字符,在重新读回后将会显示这些字符。

  • 二进制输出流后面不附加空字符。

  • 附加模式流的文件位置指示符最初放在文件末尾。

  • 写入到文本流的操作导致在写入位置截断关联文件(如果这是文件的设备类别行为)。

  • 如果使用半主机,打开的最大文件数受可用目标内存限制。

  • 存在零长度的文件,即,输出流没有在其中写入任何字符。

  • 可以多次打开文件以进行读取,但写入或更新时只能打开一次。 不能同时在一个流中打开某个文件以进行读取,而在另一个流中打开该文件以进行写入或更新。

  • 未实现本地时区和夏令时。 返回的值表示该信息不可用。 例如,gmtime() 函数始终返回 NULL

  • exit() 返回的状态与传递给它的值相同。 有关 EXIT_SUCCESSEXIT_FAILURE 的定义,请参阅头文件 stdlib.h。 但是,半主机并不将状态传回到执行环境。

  • strerror() 函数返回的错误消息与 perror() 函数提供的消息完全相同。

  • 如果请求的区域大小为零,calloc()realloc() 将返回 NULL

  • 如果请求的区域大小为零,malloc() 将返回一个指向大小为零的块的指针。

  • abort() 关闭所有打开的文件,并删除所有临时文件。

  • fprintf() 以小写十六进制格式输出 %p 参数,就好像将精度指定为 8 一样。 如果使用变体格式 (%#p),则数字前面包含字符 @

  • fscanf()%p 参数视为与 %x 参数完全相同。

  • fscanf() 始终将 %...[...] 自变量中的字符“-”视为文字字符。

  • ftell()fgetpos() 在失败时将 errno 设置为 EDOM 的值。

  • perror() 生成Table 2.16 中显示的消息。

Table 2.16. perror() 消息 

错误 消息
0 No error (errno = 0)
EDOM

EDOM - function argument out of range

ERANGE

ERANGE - function result not representable

ESIGNUM

ESIGNUM - illegal signal number

其他

Unknown error

必须在符合 ISO 的实现中指定以下特征(ARM C 库中没有指定这些特征):

  • 文件名的有效性

  • remove() 能否删除打开的文件

  • 在新名称已存在时调用 rename() 函数的效果

  • 调用 getenv() 的效果(缺省返回 NULL,无可用值)

  • 调用 system() 的效果

  • clock() 返回的值。

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0349AC
Non-Confidential