1

我阅读了作为 C 标准库一部分的C99 标准stdint.h

如果我测试 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

4

2 回答 2

5

是的。

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

#if __STDC_VERSION__ >= 199901L

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

于 2016-05-09T03:17:52.433 回答
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 的环境与其自己的合规性声明不一致(因此有问题)?

是的。

于 2016-05-09T06:46:12.673 回答