我希望编写尽可能通用的C99或更新版本代码,因此我希望确保代码具有可移植性。
<limits.h>
是C标准中指定的。C11/C17 5.2.4.2.1说明了在包含<limits.h>
时可用的宏。该表还列出了实现允许的值的最小幅度。列表中每个宏的实际值都是实现定义的。
值得注意的是,即使目标环境是嵌入式环境(即没有标准库的服务),这个头文件也应该存在于任何符合标准的实现中 - 例如C11 draft N1570 4.6:
一个符合规范的独立实现应该接受任何严格符合规范的程序,其中库子句(第7条)中指定的特性的使用仅限于标准头文件<float.h>
、<iso646.h>
、<limits.h>
、<stdalign.h>
、<stdarg.h>
、<stdbool.h>
、<stddef.h>
、<stdint.h>
和<stdnoreturn.h>
的内容。[...]CHAR_BIT
, SCHAR_MIN
, SCHAR_MAX
, UCHAR_MAX
, CHAR_MIN
, CHAR_MAX
, MB_LEN_MAX
, SHRT_MIN
, SHRT_MAX
, USHRT_MAX
, INT_MIN
, INT_MAX
, UINT_MAX
, LONG_MIN
, LONG_MAX
, ULONG_MAX
, LLONG_MIN
, LLONG_MAX
和 ULLONG_MAX
。由于 C89 没有 long long int
和 unsigned long long int
,所以最后三个不应该出现在符合 C89 标准的 C 实现中。limits.h
,也许只是因为我太累了。 - user426
<limits.h>
的替代方法是为所有目标编写等效的头文件。更容易的方法是为那些不支持它的目标编写自己的<limits.h>
。(如果有的话) - HAL9000#include <limits.h>
的编译器都不符合 C 标准的定义,也就是说该语言不属于“编程语言--C--ISO/IEC 9899”,没有什么好说的。我们应该在某个时候停止关注1989年之前编写的编译器,并且特别停止关注那些在1989年之后编写但对任何标准都置之不理的编译器。 - Antti Haapala -- Слава Україні