我在C99标准中看到stdint.h是C标准库的一部分。
如果我测试C99遵从性,是否正确地阅读了以下内容:
defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)这意味着stdint.h应该是可用的?
例如:我是否可以考虑一个环境,它假装是C99兼容的,但不提供stdint.h与它自己的遵从性声明不一致,因此出现了错误?
编辑:对于那些好奇的人来说,所讨论的系统是带有HP C编译器的OpenVMS (不是gcc,它在openVMS上提供了stdint.h)。因此,根据到目前为止收到的答复和评论,我不得不把这个实现(假装是C99)看作是错误的。有关更多详细信息:https://groups.google.com/forum/#!topic/comp.os.vms/Bnh3tIOc7bo%5B101-125%5D
发布于 2016-05-09 03:17:52
是。
顺便说一句,未定义的符号在预处理表达式中扩展为0,因此您只需编写:
#if __STDC_VERSION__ >= 199901L另一方面,不声称符合C99 (或C11)的实现可能仍然支持将<stdint.h>作为扩展。
发布于 2016-05-09 06:46:12
stdint.h是强制执行任何符合标准的实现的少数头之一。即使是各种不知名的嵌入式系统编译器也必须这样做。见规范案文C11第4/6章:
合格的托管实现应接受任何严格符合的程序。符合规范的独立实现应接受任何严格符合的程序,其中库子句(第7条)中指定的特性的使用仅限于标准标头、
<float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>,和<stdnoreturn.h>的内容。
因此,您确实可以测试__STDC_VERSION__ >= 199901L,然后报头必须可用。请注意,对inttypes.h没有这样的要求。
例如:我是否可以考虑一个假装符合C99但不提供stdint.h的环境与它自己的遵从性声明(因此是but )不一致?
是。
https://stackoverflow.com/questions/37107259
复制相似问题