繁体   English   中英

stdint.h和C99

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM