在 C++11 中,我可以选择是否要使用带或不带命名空间 std:: 中定义的类型
至少我的编译器(g++ 4.7)接受这两种变体。
我的问题是:使用 cstdint 中的 typedef 的推荐方法是什么。有或没有命名空间?有什么优点或缺点?或者这只是风格问题?
所以变体a):
#include <cstdint>
std::uint8_t n = 21;
resp:
#include <cstdint>
using std::uint8_t;
uint8_t n = 21;
或变体b):
#include <cstdint>
uint8_t n = 21;
首选在中声明的名称std
命名空间。原因在 §17.6.1.3/4 中给出(ISO/IEC 14882:2011(E),C++11):
除第 18 条至第 30 条和附录 D 中注明的情况外,每个标头的内容cname应与相应的标头相同name.h
,如 C 标准库 (1.2) 或 C Unicode TR 中所指定(视情况而定),就像通过包含一样。然而,在 C++ 标准库中,声明(除了在 C 中定义为宏的名称)位于命名空间的命名空间范围 (3.3.6) 内std
。未指定这些名称是否首先在全局命名空间范围内声明,然后注入命名空间std
通过显式使用声明(7.3.3)。
如果您使用来自<c
name>
标题没有std
,您的程序依赖于未指定的要求。
这在 C++03 及更早版本中有所不同,其中名称只应该出现在std
命名空间。然而,现实情况是,许多实现只是简单地注入 C 标准库头文件的内容<
name.h>
into std
所以这在 C++11 中得到了解决。 C++03 标准中的相应部分 (§17.4.1.2/4) 表示:
除非第 18 至 27 条中另有说明,否则每个标头的内容cname应与相应的标头相同name.h
,如 ISO/IEC 9899:1990 编程语言 C(第 7 条)中指定,或 ISO/IEC:1990 编程语言 — C 修正案 1:C 完整性(第 7 条),视情况而定,如同通过包含一样。然而,在 C++ 标准库中,声明和定义(除了在 C 中定义为宏的名称)位于命名空间的命名空间范围 (3.3.5) 内std
.
除此之外,限定名称std::
有助于避免碰撞——如果你完全限定它,你就确切地知道你会得到什么。如果你真的要做using namespace std
or using std::something
,至少在尽可能小的范围内做到这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)