- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
stdint.h
和cstdint
有什么区别?
它们都在 MSVC (Visual Studio 2010) 和 gcc-4.5.1 中可用。还都定义了 intX_t
/uintX_t
类型(其中 X
是类型的字节大小)。
stdint.h
定义了没有任何命名空间的每个类型,cstdint
类型位于 std
命名空间中。
std
命名空间中?这两个标题有什么不同?cstdint
没有文件扩展名并使用 c
前缀,stdint.h
使用 .h
扩展名.
c
前缀表示这是一个 C 库? cstdint
中缺少文件扩展名是有原因的吗?最佳答案
C++98 的初衷是应该使用 <cstdint>
在 C++ 中,为了避免污染全局命名空间(嗯,不是 <cstdint>
,特别是它只在 C++11 中添加,而是一般的 <c*>
header )。
然而,实现仍然坚持将符号放入全局命名空间,C++11 批准了这种做法[*]。所以,你基本上有三个选择:
<cstdint>
并且要么完全限定您使用的每个整数类型,要么使用 using std::int32_t;
将其纳入范围等(烦人,因为冗长,但它是正确的方法,就像 C++ 标准库中的任何其他符号一样)<stdint.h>
(因为已弃用而有点糟糕)<cstdint>
并假设您的实现会将符号放在全局命名空间中(非常糟糕,因为无法保证)。在实践中,我怀疑大量烦人的代码使用最后一个选项,仅仅是因为在 <cstdint>
的实现中很容易意外地做到这一点。将符号放在全局命名空间中。你应该尝试使用第一个。第二个优点是保证将东西放在全局命名空间中,而不是仅仅可能这样做。我认为这不是特别有用,但如果这是您的优先事项,它可能会节省一些打字时间。
还有第四个选项,#include <cstdint>
紧随其后的是 using namespace std;
这有时很有用,但有些地方你不应该把 using namespace std;
.不同的人会有不同的想法,这些地方在哪里,但是“在头文件的顶层”比“在cpp文件的顶层”差,这比“在有限的范围内”差。有些人从不写using namespace std;
完全没有。
[*] 这意味着允许 C++ 标准头文件将内容放在全局命名空间中,但不是必须的。因此,您必须避免与这些符号发生冲突,但您实际上不能使用它们,因为它们可能不存在。基本上,C++ 中的全局命名空间是一个雷区,尽量避免它。有人可能会争辩说,委员会已经通过实现批准了一种几乎与坚持 using namespace std;
一样有害的做法。在头文件的顶层——不同之处在于实现只对 C 标准库中的符号执行此操作,而 using namespace std;
也适用于仅限 C++ 的符号。 C 标准中有一个部分列出了为将来添加到标准中而保留的名称。将这些名称也视为保留在 C++ 全局命名空间中并不是一个完全愚蠢的想法,但这不是必需的。
关于c++ - <cstdint> 与 <stdint.h>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13642827/
之间有什么区别?和 ? (除此之外,一个将东西放在命名空间 std:: 中,另一个放在 std::tr1:: 中) 由于这些东西还不是标准的,我猜它是特定于编译器的,所以我在谈论 gcc。要用非
我一直在我的代码中定期使用 cstdint 的类型(例如 uint32_t),但现在它们不太符合我的需求,尤其是在模板方面。 有没有办法指定一个两倍于模板参数大小的整数类型?当我的模板传递一个 uin
( ) header 定义了几种整数类型,它们的名称遵循以下模式:intN_t , 其中N是位数,而不是字节数。 鉴于字节的长度没有严格定义为 8 位,为什么不将这些类型定义为例如 int1_t而
我正在尝试在命令上构建几个项目,但我一直因为找不到 而搞砸了.该项目在到达包含路径中的特定行时尝试构建一个,特别是 #include 它抛出一个错误 fatal error: 'cstdint' f
在 C++11 中,我可以选择是否要使用在有或没有命名空间 std::中定义的类型 至少我的编译器 (g++ 4.7) 接受这两种变体。 我的问题是:使用 cstdint 中的 typedef 的推荐
我一直在思考要不要使用里面的typedef与否。 我个人更喜欢写 uint32_t超过 unsigned int和 int8_t超过 char等等......因为它对我来说更直观。 你们怎么看?使用
Boost 的 C99 stdint 实现非常方便。不过有一件事让我很烦恼。他们将所有 typedef 转储到 boost namespace 中.在使用此工具时,这给我留下了三个选择: 使用“usi
我使用的是 Mac 10.10 和 OpenCV 3.0,当我编译我的项目时出现了这个错误: ld: symbol(s) not found for architecture x86_64 clang
stdint.h和cstdint有什么区别? 它们都在 MSVC (Visual Studio 2010) 和 gcc-4.5.1 中可用。还都定义了 intX_t/uintX_t 类型(其中 X 是
从我对 boost 的窥视中和 libstdc++ , 库通常使用 std::size_t和 std::ssize_t每当事先不知道无符号/有符号索引的上限/下限时。我的问题是:为什么不使用 uint
C++ 标准是否保证: sizeof(uint8_t) <= sizeof(uint16_t) <= sizeof(uint32_t) <= sizeof(uint64_t) sizeof(uint_
我正在尝试编译一个使用 cstdint 的应用程序。由于 Apple 已弃用 gcc,我想尝试使用 clang 编译它,但出现错误: fatal error: 'cstdint' file not f
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我正在用 C++ 构建一个项目,但遇到了一些标准库问题。 当我使用 uint_t 系列类型时,编译器显示一条错误消息。 例如,当我声明一个 uint_8 类型的变量时,它在 vim 中显示错误 uin
当使用 -fmodules 编译时,以下简单的测试用例文件给我一个编译时错误,提示来自 Clang 的 github 镜像的“master” ,使用如下所示的命令。我想知道这是否是 Clang 的新实
什么会导致这些错误?我在 Xcode 中添加了一个空项目,在 Header Search Paths 中添加了/usr/local/lib,并添加了一些 opencv 库。建筑给出了这些错误: 更新
是否有可能,至少在理论上,cstdint typedef 绑定(bind)到某些实现特定类型 std::numeric_limits 不是专门用于? 根据http://www.cplusplus.co
我正在使用 Keil uVision4 在 STM32F2 设备上进行开发。我正在尝试使用 C++,这应该可以通过 uVision 工具链提供的 armcc(如果我错了请纠正我)实现。但是 uVisi
今天我正在尝试在 cstdint 头文件中定义的一些类型:std::uint16_t, std::uint_least16_t 等等.. 我认为它们非常有用,因为您确切地知道或至少知道它们有多大,这与
早上好 我正在尝试执行以下操作: #include //Boost for sparse and cstdint #include #include #include int main(){
我是一名优秀的程序员,十分优秀!