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++全局命名空间中保留的并不是一个完全愚蠢的想法,但它并不重要.
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中提供这些名称. - 末端的例子]
| 归档时间: |
|
| 查看次数: |
45999 次 |
| 最近记录: |