stdint.h和C99

时间:2016-05-09 03:11:14

标签: c c99 standard-library openvms stdint

我在C99 standard中读到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

2 个答案:

答案 0 :(得分:5)

顺便说一句,未定义的符号在预处理器表达式中扩展为0,所以你可以写:

#if __STDC_VERSION__ >= 199901L

另一方面,声称符合C99(或C11)的实现可能仍然支持<stdint.h>作为扩展。

答案 1 :(得分:2)

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的环境与自己的合规声明(因此有错误)不一致吗?