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