<cstdint> vs <stdint.h>

stdint.hcstdint什么cstdint

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

  • 如果两个头文件中的基本原理是相同的(便携式),那么我必须做出什么决定来决定哪一个呢?

stdint.h定义了没有任何名称空间的每个types, cstdinttypes位于std名称空间中。

  • 是否有任何理由包含或不包括定义的types到std命名空间? 两个标题有什么不同?

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

  • 这个头文件的命名约定是什么? c前缀表示这是一个C库? 在cstdint缺less文件扩展的cstdint什么?

在C ++ 98中的初衷是你应该在C ++中使用<cstdint> ,以避免污染全局命名空间(特别是,不是特别的<cstdint> ,它只是在C ++ 11中添加的,而是<c*>一般的标题)。

然而,实现仍然坚持把符号放到全局名称空间中,而C ++ 11批准了这种做法[*]。 所以,你基本上有三个select:

  • 使用<cstdint>并完全限定您使用的每个整数types,或者using std::int32_t;将其引入到作用域中using std::int32_t; 等等(烦人因为冗长,但它是正确的方式来做,就像在C ++标准库中的任何其他符号一样)
  • 使用<stdint.h> (稍微不好,因为不推荐)
  • 使用<cstdint>并假设你的实现将符号放在全局命名空间(非常糟糕,因为不能保证)。

在实践中,我怀疑大量的代码会使用最后一个选项,只是因为在<cstdint>将符号放入全局名称空间的实现中偶然执行它是很容易的。 你应该尝试使用第一个。 第二个有一个优点,那就是保证把东西放在全局命名空间中,而不是只做可能。 我不认为这是特别有用的,但如果这是您的优先事项,可能会节省一些打字。

还有第四个选项, #include <cstdint>后面跟着using namespace std; 这有时是有用的,但有些地方你不应该using namespace std; 。 不同的人在这些地方会有不同的想法,但是“头文件中的顶层”比“在cpp文件中的顶层”更差,这比“有限的范围”更差。 有些人从来不会using namespace std;using namespace std; 在所有。

这意味着C ++标准头文件被允许将东西放在全局名称空间中,但不是必需的。 所以你必须避免与这些符号相冲突,但实际上不能使用它们,因为它们可能不在那里。 基本上,C ++中的全局命名空间是一个雷区,尽量避免它。 有人可能会争辩说,委员会已经通过实施批准了一个实践,几乎像using namespace std;一样有害using namespace std; 在头文件中的顶层 – 不同之处在于实现只对C标准库中的符号执行,而using namespace std; 它也适用于C ++ – 只有符号。 C标准中有一部分列出了为将来添加到标准而保留的名称。 在C ++全局名称空间中保留这些名称并不是一个完全愚蠢的想法,但这不是必需的。

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

C标准库的特征也在C ++标准库中提供,作为一般的命名约定,它们被C预先挂载到C标准库中的对应名称。

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

 #include <cstdint> 

并完全符合您使用std::的符号名称
而在C中,你应该使用:

 #include <stdint.h> 

附录D(规范性)兼容性function[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.hforms的name.h ,就像每个名字放在标准库名字空间中的相应的cname header ,放在全局名字空间的范围内。 没有指定这些名称是首先在名称空间std的名称空间作用域(3.3.6)中声明还是定义的,然后通过显式使用声明(7.3.3)将其注入到全局名称空间作用域中。

3 [示例:头文件<cstdlib>确实在命名空间std中提供了它的声明和定义。 它也可能在全局命名空间中提供这些名字。 头文件<stdlib.h>确实在全局命名空间中提供了相同的声明和定义,就像C标准一样。 它也可能在名字空间std中提供这些名字。 – 例子]

  1. cstdint是C ++ 11头文件, stdint.h是C99头文件(C和C ++是不同的语言!)

  2. MSVC 2008既不包含stdint.h也不包含cstdint

  3. cstdint实现大多是简单的#include <stdint.h> ,其中包含一些命名空间/语言修复。