是什么区别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*>
一般头)。
然而,实现坚持把符号变成全局命名空间,无论如何,和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 ++全局命名空间预留太多的名字,但它不是必需的。
包括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中的这些名字。 末端示例]