Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
标准力h和C99_C_C99_Standard Library_Openvms_Stdint - Fatal编程技术网

标准力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年之前的任何版本