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 ++全局命名空间中保留也不是一个完全愚蠢的主意,但这不是必需的。
<cstdint>
。这是我收到的错误:./misc.h:7:10: fatal error: 'cstdint' file not found
。