用于 C++98 的 stdint (gcc/clang)

stdint for C++98 (gcc/clang)

提问人:user5534993 提问时间:8/28/2023 更新时间:8/28/2023 访问量:106

问:

为什么 GCC/clang 抱怨在编译 C++98 时包含而不是包含?cstdintstdint.h

使用以下输出进行编译:-std=c++98 -x c++ -Wall -Wextra -pedantic#include <cstdint>

此文件需要编译器和库支持 ISO C++ 2011 标准。

根据 C++98 标准,没有定义任何标头。

C++ C 预处理器 C++98

评论

0赞 user17732522 8/29/2023
我猜 GCC/glibc 开发人员只是务实。标头在 C99/C++11 之前不存在,如果有人在此之前包含它,那么无论如何都不会指定程序行为。因此,不存在一致性问题。对于变体,如果类型已在全局命名空间范围内声明,则实现应该通过声明引入声明。由于是 C++11 的一项功能,因此标头不能在以前的 C++ 模式下工作。<cstdint>std::usingusing

答:

2赞 user5534993 8/28/2023 #1

海湾合作委员会

该指令由 GNU C 预处理器 (CPP) 执行,用于 C C++ 源代码。默认情况下,CPP 搜索头文件的标准系统目录包含 C 标准库的头文件。对于 C++,首先使用其他目录进行搜索。因此,即使对于 C++ 源代码,C 标准库标头在默认情况下也可用。因此,找到的标头不是自 C++11 以来可用的兼容性标头。但相反,自 C99 以来可用的 C 标准库标头。#includestdint.h

我从旧版本的 GNU CPP 文档中推断出这一点:

GCC 在几个不同的位置查找标头。[...]对于 C++ 程序,它还将首先查看 [...]。

另请参阅 GNU CPP 选项 -nostdinc 和 -nostdinc++

⚠ 我假设这种行为不受 C++ 标准的支持。

评论

1赞 user17732522 8/29/2023
GCC 将找到自己的包装器,无论标志如何,甚至是否使用 C 或 C++。请参见 godbolt.org/z/o5EeM7cYe。他们本可以根据 C/C++ 模式决定失败,但没有。它还可以在 C89 模式下使用 .stdint.h-std-pedantic-errors
0赞 Andrey Semashev 8/28/2023 #2

C++ 标准仅记录属于 C++ 标准库的标头。自 C++11 以来,其中一个标头是 .如果在 C++03 或 C++98 模式下包含此标头,编译器将生成一条警告,指出此标头不是所选 C++ 标准版本的一部分。cstdint

标头是 C 标准库的一部分,不在 C++ 标准中(除了作为对 C 标准的引用)。此标头在许多其他标准中也有描述,例如 POSIX。C++编译器允许包含C标准库头文件以及系统头文件,这就是包含有效的原因,尽管该头文件定义的类型未放在.事实上,通常(但不一定)C++ 标准头文件是在内部使用 C 标准头文件实现的。然而,C++ 标准并不涵盖这些标头,事实上,这些标头并不依赖于您选择的 C++ 版本。因此,当您包含这些标头时,编译器不会抱怨,即使在较旧的 C++ 版本中也是如此。stdint.hstdint.hnamespace std

评论

1赞 Jan Schultke 8/28/2023
事实并非如此。 和其他标头在 support.c.headers.general 中的 C++ 标准中介绍。stdint.h
0赞 Andrey Semashev 8/28/2023
@JanSchultke 该部分的标题和第一段证实了我所说的 - “C 标题”。C++ 标准只是承认存在 C 标准库,并且它可用于 C++ 程序。除了引用 C 标准之外,它没有定义这些标头的内容。
0赞 user5534993 8/28/2023
请注意,旧的 C++98 标准中没有提到这一点。stdint.h
0赞 Andrey Semashev 8/28/2023
@user5534993 不需要。我的回答是,有些标头未被 C++ 标准覆盖。C++ 编译器不需要发出有关这些标头的警告。
1赞 Jan Schultke 8/28/2023
@AndreySemashev C++标准承认 C 头文件的存在,甚至承认 C 头文件的内容(在某些情况下)。它对一些标头一直到 C++98 中都是这样做的。事实上,它不用于 / 是因为这是一个 C99 标头,因此 C++98 早于它。但是,可以肯定的是,在 C++11 之前,C99 标头的相同互操作性也应该是可能的。stdint.hcstdint