<cstdint> vs <stdint.h>

Pap*_*ter 83 c++ cstdint stdint

stdint.h和之间有什么区别cstdint

它们都可以在MSVC(Visual Studio 2010)和gcc-4.5.1中使用.还定义了intX_t/ uintX_ttypes(其中X是类型的字节大小).

  • 如果两个标题中的基本原理相同(便携式类型),我必须做出哪些决定来决定其中一个?

stdint.h定义了每个类型没有任何名称空间,该cstdint类型在于std命名空间.

  • 是否有任何理由在std命名空间中包含或不包含已定义的类型?这两个标题有什么不同?

cstdint没有文件扩展名并使用c前缀,stdint.h使用.h扩展名.

  • 此标头的命名约定是什么?该c前缀表示这是一个C库?缺少文件扩展的原因是cstdint什么?

Ste*_*sop 112

C++ 98中的初衷是你应该<cstdint>在C++中使用,以避免污染全局命名空间(嗯,<cstdint>特别是,这只是在C++ 11中添加,但<c*>通常是标题).

但是,实现仍然坚持将符号放入全局命名空间,而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++全局命名空间中保留的并不是一个完全愚蠢的想法,但它并不重要.

  • @PaperBirdMaster:C++标准库头文件没有文件扩展名:`<iostream>`,`<vector>`,`<cstdlib>`,除了C兼容性之外:`<stdint.h>`,` <stdlib.h>中`.是的,最初的`c`表示`<cstdlib>`是C++相当于C标准头文件`<stdlib.h>`,而不是像C++一样全新的`<vector>`.有一个C++标题`<complex>`,所以我们不得不希望C的未来版本不会引入标准的标题`<omplex.h>`. (23认同)
  • @JL2210 请注意,他说的是“&lt;omplex.h&gt;”,而不是“&lt;complex.h&gt;”。如果 C 添加了“&lt;omplex.h&gt;”,则 C++ 等效项将是“&lt;complex&gt;”。 (2认同)

Alo*_*ave 15

包括cstdint在std命名空间中导入符号名称,也可能在Global名称空间中导入.
包括stdint.h在Global命名空间中导入符号名称,也可能在std命名空间中导入.

C标准库中还提供了C标准库的功能,作为一般命名约定,它们由c标准库中的相应名称预先设置.

在C++中,您应该使用:

#include <cstdint>
Run Code Online (Sandbox Code Playgroud)

并且std::
在C中完全限定您使用的符号名称,您应该使用:

#include <stdint.h>
Run Code Online (Sandbox Code Playgroud)

附件D(规范性)兼容性特征[depr]指出:

D.6 C标准库头

1为了与C标准库和C Unicode TR兼容,C++标准库提供了25个C头,如表151所示.

其中包括:

<assert.h> <float.h> <math.h> <stddef.h> <tgmath.h> <complex.h> <inttypes.h> <setjmp.h> <stdio.h> <time.h> <ctype.h> <iso646.h> <signal.h> <stdint.h> <uchar.h> <errno.h> <limits.h> <stdarg.h> <stdlib.h> <wchar.h> <fenv.h> <locale.h> <stdbool.h> <string.h> <wctype.h>

并进一步,

2 每个C标头(每个标头都有一个表单名称)的name.h行为就好像每个名称放置在标准库名称空间中的名称cname header都放在全局名称空间范围内.未指定是在名称空间std的名称空间作用域(3.3.6)中首先声明或定义这些名称,然后通过显式使用声明(7.3.3)将这些名称注入到全局名称空间作用域中.

3 [示例:标头<cstdlib>肯定在命名空间std中提供其声明和定义.它还可以在全局命名空间中提供这些名称.标题<stdlib.h>肯定在全局命名空间中提供相同的声明和定义,就像在C标准中一样.它还可以在命名空间std中提供这些名称. - 末端的例子]