stdint.h和cstdint之间的区别是什么
它们都在MSVC (Visual Studio2010)和gcc-4.5.1中可用。此外,两者都定义了intX_t/uintX_t类型(其中X是该类型的字节大小)。
stdint.h定义了没有任何名称空间的每种类型,cstdint类型位于std名称空间中。
std命名空间中包含或不包含已定义的类型?这两个标头之间有什么不同?cstdint没有文件扩展名并使用c前缀,stdint.h使用.h扩展名。
c前缀表明这是一个C库?cstdint中没有文件扩展名是有原因的
发布于 2012-11-30 18:08:03
C++98的初衷是,您应该在C++中使用<cstdint>,以避免污染全局名称空间(嗯,不是特别的<cstdint>,它只在C++11中添加,而是一般的<c*>头)。
然而,无论如何,实现坚持将符号放入全局名称空间,并且C++11批准了这种做法*。所以,你基本上有三个选择:
<cstdint>,或者完全限定您使用的每个整数类型,或者使用using std::int32_t;等将其纳入作用域(因为冗长,这很烦人,但这是正确的方法,就像处理C++标准库中的任何其他符号一样)<stdint.h> (稍微不好,因为deprecated)<cstdint>,并假设您的实现将把符号放在全局名称空间中)(非常糟糕,因为不是just在实践中,我怀疑有大量恼人的代码使用最后一个选项,原因很简单,因为在<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++全局名称空间中的保留名称也不是一个完全愚蠢的想法,但这不是必需的。
发布于 2012-11-30 18:03:09
包含cstdint将符号名称导入到标准命名空间中,也可能导入到全局命名空间中。
包含stdint.h会导入全局名称空间中的符号名称,可能也会导入标准名称空间中的符号名称。
C++标准库中也提供了C标准库的功能,并且作为通用命名约定,它们在C标准库中的相应名称前面加上一个c。
在C++中,您应该使用:
#include <cstdint>并完全限定与std::一起使用的符号名称
在C中,你应该使用:
#include <stdint.h>声明:附录D(标准)兼容性特性描述:
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标头,每个标头都有一个格式为using
name.h**,的名称,就好像由相应的**cname header放置在标准库命名空间中的每个名称都放在全局命名空间范围内一样。未指定这些名称是首先在命名空间标准的命名空间作用域(3.3.6)内声明还是定义,然后通过显式-声明(7.3.3)注入到全局命名空间作用域中。
3示例:头<cstdlib>肯定在名称空间std中提供了它的声明和定义。它还可以在全局名称空间内提供这些名称。头<stdlib.h>在全局名称空间中肯定提供了相同的声明和定义,与C标准中的声明和定义非常相似。它还可以在命名空间std中提供这些名称。-end示例
发布于 2012-11-30 18:04:00
cstdint是C++11标头,stdint.h是C99标头(C和C++是不同的languages!)stdint.h of cstdint大多是带有一些名称空间/语言修复的简单#include <stdint.h>。https://stackoverflow.com/questions/13642827
复制相似问题