VS ( vs )

2019-06-21 09:36发布

是什么区别stdint.hcstdint

他们两人都是在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

Answer 1:

在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 ++全局命名空间预留太多的名字,但它不是必需的。



Answer 2:

包括cstdint进口std名字空间,并可能在全局命名空间的符号名。
包括stdint.h进口全局命名空间,并可能在STD命名空间中的符号名。

在C ++标准库还提供了C标准库的特点及作为一般的命名惯例他们是预先计划由C在C标准库相应的名称。

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

#include <cstdint>

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

#include <stdint.h>

附件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中的这些名字。 末端示例]



Answer 3:

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

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

  3. 的实施方式中cstdint大多只是#include <stdint.h>的一些命名空间/语言修复。



文章来源: vs