C:是否跨平台支持<limits.h>?

3

我希望编写尽可能通用的C99或更新版本代码,因此我希望确保代码具有可移植性。


2
什么是跨平台?这是一个标准头文件,但实际限制的值是由具体实现定义的。标准只提到了最低要求的值。 - Sourav Ghosh
你需要这个参考资料吗?是的。你没有找到这样的参考资料吗? - Davis Herring
1
可移植代码并不存在。存在的是已成功移植的应用程序。因此,编写“尽可能可移植”的代码是一种幻想。 - Basile Starynkevitch
不使用<limits.h>的替代方法是为所有目标编写等效的头文件。更容易的方法是为那些不支持它的目标编写自己的<limits.h>。(如果有的话) - HAL9000
1
换句话说,任何一个无法使用 #include <limits.h> 的编译器都不符合 C 标准的定义,也就是说该语言不属于“编程语言--C--ISO/IEC 9899”,没有什么好说的。我们应该在某个时候停止关注1989年之前编写的编译器,并且特别停止关注那些在1989年之后编写但对任何标准都置之不理的编译器。 - Antti Haapala -- Слава Україні
显示剩余2条评论
1个回答

2

<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>的内容。[...]
这段文字的意思是:这些宏在 C11/C17 中,包括 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_MAXULLONG_MAX。由于 C89 没有 long long intunsigned long long int,所以最后三个不应该出现在符合 C89 标准的 C 实现中。

我对“即使目标是独立环境”持怀疑态度。你能引用标准中表明这一点的语句吗?OSDec Wiki没有将其作为独立头文件提及... - user426
@user426 为什么你比起 Stack Overflow 更信任 OSDev Wiki 呢? :D - Antti Haapala -- Слава Україні
@user426 也许你应该重新阅读维基百科。我找不到任何一页没有列出 limits.h 的页面。 - Antti Haapala -- Слава Україні
嗯,你当然是对的,limits.h是(幸运的是)独立的。我现在也看到所有页面上都提到了limits.h,也许只是因为我太累了。 - user426

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接