[英]stdint.h and C99
我在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
是。
顺便说一下,预处理器表达式中未定义的符号扩展为0
,因此您可以编写:
#if __STDC_VERSION__ >= 199901L
另一方面, 不声称符合C99(或C11)的实现可能仍支持<stdint.h>
作为扩展。
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与其自己的合规性声明不符(从而引起故障)的环境?
是。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.