有什么区别stdint.h
and cstdint
?
它们都可以在 MSVC (Visual Studio 2010) 和 gcc-4.5.1 中使用。并且两者都定义了intX_t
/uintX_t
类型(其中X
是类型的大小(以位为单位)。
- 如果两个标头中的基本原理相同(可移植类型),我必须做出哪些决定来决定其中一个?
The stdint.h
定义每个类型时没有任何命名空间,cstdint
类型在于std
命名空间。
- 是否有任何理由将定义的类型包含或不包含到
std
命名空间?这两个标题有什么不同?
cstdint
没有文件扩展名并使用c
字首,stdint.h
使用.h
扩大。
- 该标头的命名约定是什么?这
c
前缀表明这是一个C库?缺少文件扩展名是有原因的cstdint
?
C++98 的初衷是你应该使用<cstdint>
在 C++ 中,为了避免污染全局命名空间(好吧,不是<cstdint>
特别是,它仅在 C++11 中添加,但<c*>
一般情况下的标题)。
然而,无论如何,实现仍然坚持将符号放入全局命名空间,并且 C++11 批准了这种做法[*]。所以,你基本上有三个选择:
- Use
<cstdint>
并且要么完全限定您使用的每个整数类型,要么将其纳入范围using std::int32_t;
等(因为冗长而令人烦恼,但这是正确的方法,就像 C++ 标准库中的任何其他符号一样)
- Use
<stdint.h>
(有点糟糕,因为已弃用)
- Use
<cstdint>
并假设您的实现会将符号放入全局名称空间中(非常糟糕,因为不能保证)。
在实践中,我怀疑有大量烦人的代码使用了最后一个选项,仅仅是因为在实现中很容易意外地执行此操作<cstdint>
将符号放入全局命名空间中。您应该尝试使用第一个。第二个有一个优点,那就是保证将东西放入全局名称空间中,而不是仅仅执行它。我认为这不是特别有用,但如果这是您的首要任务,它可能会节省一些打字时间。
还有第四种选择,#include <cstdint>
其次是using namespace std;
有时很有用,但有些地方不应该放置using namespace std;
。不同的人对这些地方的位置会有不同的想法,但“在头文件的顶层”比“在 cpp 文件的顶层”更糟糕,而“在有限的范围内”更糟糕。有些人从来不写using namespace std;
at all.
[*] 这意味着 C++ 标准头允许将内容放入全局命名空间中,但不是必需的。因此,您必须避免与这些符号发生碰撞,但您实际上无法使用它们,因为它们可能不存在。基本上,C++中的全局命名空间是一个雷区,尽量避开它。有人可能会争辩说,委员会已经批准了一项实施实践,其危害性几乎与坚持using namespace std;
位于头文件的顶层——区别在于实现仅针对 C 标准库中的符号执行此操作,而using namespace std;
也适用于仅 C++ 符号。 C 标准中有一个部分列出了为将来添加标准而保留的名称。将这些名称也视为保留在 C++ 全局命名空间中并不是一个完全愚蠢的想法,但这不是必需的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)