标准力h和C99
我在文章中读到,标准力h和C99,c,c99,standard-library,openvms,stdint,C,C99,Standard Library,Openvms,Stdint,我在文章中读到,stdint.h是C标准库的一部分 如果我使用以下方法测试C99合规性,我是否正确理解了这一点: defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) 这意味着stdint.h应该可用吗 实例:我能考虑一个假装为 C99 的环境,但不提供 Stdit.H./C> >与它自己的符合性声明不一致,因此Bugy?< /P> 编辑:对于好奇的人来说,所讨论的系统是带有HP C编译器的OpenVMS(
stdint.h
是C标准库的一部分
如果我使用以下方法测试C99合规性,我是否正确理解了这一点:
defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
这意味着stdint.h
应该可用吗
实例:我能考虑一个假装为<代码> C99 <代码>的环境,但不提供<代码> Stdit.H./C> >与它自己的符合性声明不一致,因此Bugy?< /P> 编辑:对于好奇的人来说,所讨论的系统是带有HP C编译器的OpenVMS(不是gcc,它在OpenVMS上提供
stdint.h
)。因此,根据迄今为止收到的答案和评论,我必须考虑这一实施(假装C99)作为马车。有关详细信息:是
顺便提一下,未定义的符号在预处理器表达式中扩展为0
,因此您可以只编写:
#if __STDC_VERSION__ >= 199901L
另一方面,未声明符合C99(或C11)的实现可能仍然支持
作为扩展。是
顺便提一下,未定义的符号在预处理器表达式中扩展为0
,因此您可以只编写:
#if __STDC_VERSION__ >= 199901L
另一方面,未声明符合C99(或C11)的实现可能仍然支持
作为扩展。stdint.h
是任何符合性实现强制实现的少数头文件之一。即使是各种默默无闻的嵌入式系统编译器也必须这样做。参见标准文本C11第4/6章:
顺从的
托管实施应接受任何严格符合要求的程序。顺从的
独立实施应接受任何严格遵守的程序,其中
图书馆条款(第7条)中规定功能的使用仅限于以下内容:
标准标题、、、
和
因此,您确实可以测试\uuu STDC\u VERSION\uuu>=199901L
,然后标头必须可用。注意,inttypes.h
没有这样的要求
一个例子:我能考虑一个假装为C99的环境,但不提供Stdit.h与它自己的顺从性声明(因此是BUGGY)的矛盾吗?< /P>
是。
stdint.h
是任何一致性实现都必须实现的少数头文件之一。即使是各种默默无闻的嵌入式系统编译器也必须这样做。参见标准文本C11第4/6章:
顺从的
托管实施应接受任何严格符合要求的程序。顺从的
独立实施应接受任何严格遵守的程序,其中
图书馆条款(第7条)中规定功能的使用仅限于以下内容:
标准标题、、、
和
因此,您确实可以测试\uuu STDC\u VERSION\uuu>=199901L
,然后标头必须可用。注意,inttypes.h
没有这样的要求
一个例子:我能考虑一个假装为C99的环境,但不提供Stdit.h与它自己的顺从性声明(因此是BUGGY)的矛盾吗?< /P>
是。这取决于编译标志。有些警告只是不喜欢未定义的宏并被触发(请参见gcc
-Wundef
)。@Cyan您必须显式启用它,因为它不是由-Wall-Wextra-pedantic
启用的。此外,只有在-ansi
模式下编译时,定义才会丢失。但是,同样,如果您担心在C99模式下编译时是否符合标准,autoconf
是测试功能的唯一可移植方法。@Cyan:问题没有指定gcc。任何兼容C99(或兼容C11)的实现都必须提供
@user6292850:正如我所提到的,问题没有指定gcc。但从第5版开始,默认语言选项从-std=gnu89
更改为-std=gnu11
,它支持C11加上GNU特定的扩展。作为上一点的示例,Microsoft的编译器不久前开始提供stdint.h
,但没有定义\uu STDC\u VERSION\uuu
(因为C99仍有一些方面不受支持)。这取决于编译标志。有些警告不喜欢未定义的宏并被触发(请参见gcc-Wundef
).@Cyan您必须显式启用它,因为它不是由-Wall-Wextra-pedantic
启用的。此外,只有在-ansi
模式下编译时,定义才会丢失。但是,如果您担心在C99模式下编译时是否符合标准,autoconf
是测试功能的唯一便携式方法。@Cyan:问题没有指定gcc。任何C99兼容(或C11兼容)实现必须提供
@user6292850:正如我提到的,问题没有指定gcc。但是从第5版开始,默认语言选项从-std=gnu89
更改为-std=gnu11
,它支持C11加上特定于GNU的扩展。作为您最后一点的示例,Microsoft编译器开始提供stdint.h
不久前,但没有定义\uuuu STDC\u VERSION\uuuu
(因为C99仍有一些方面不受支持)。这不是很可靠。例如,Solaris 7提供了inttypes
,但没有stdint
。我会放弃任何特别的定义,只使用@user6292850:你是说Solaris 7(1998年发布)通过将\uu STDC\u VERSION\uu
定义为至少与199901L
?@rici要求stdint.h
,声称C99符合要求,根据定义…@user6292850:stdint.h由C99添加(随后由Posix-2001(第6期)添加,您引用)作为inttypes.h的一个子集,1998年C编译器提供了inttypes.h这一事实并没有说明什么。这样的编译器当然可以兼容C90和Posix.1997年之前的任何版本