C++98 的初衷是你应该<cstdint>
在 C++ 中使用,以避免污染全局命名空间(嗯,不是<cstdint>
特别是,它只在 C++11 中添加,但<c*>
通常是头文件)。
然而,实现仍然坚持将符号放入全局命名空间,C++11 批准了这种做法[*]。所以,你基本上有三个选择:
- 使用
<cstdint>
并完全限定您使用的每个整数类型,或者使用using std::int32_t;
etc 将其带入范围(烦人,因为冗长,但它是正确的方法,就像 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++ 全局命名空间中并不是一个完全愚蠢的想法,但这并不是必需的。