在C++11中,我可以选择使用在中定义的类型,是否使用名称空间std::
至少我的编译器(g++ 4.7)接受这两种变体。
我的问题是:使用cstdint中的typedefs的推荐方式是什么。使用还是不使用名称空间?有什么优势或劣势?或者这只是一个风格问题?
所以变体a):
#include <cstdint>
std::uint8_t n = 21;响应:
#include <cstdint>
using std::uint8_t;
uint8_t n = 21;或变体b):
#include <cstdint>
uint8_t n = 21;发布于 2012-10-30 05:35:07
在std命名空间中声明的首选名称。原因见§17.6.1.3/4 (ISO/IEC 14882:2011(E),C++11):
除非在第18至30条和附件D中另有说明,否则每个标题cname的内容应与C标准库(1.2)或C Unicode TR (视情况而定)中指定的相应标题名称
.h的内容相同,如同包含在其中一样。然而,在C++标准库中,声明(除了在C中定义为宏的名称)在名称空间std的名称空间作用域(3.3.6)内。未指定这些名称是否首先在全局命名空间范围内声明,然后通过显式使用-声明(7.3.3)注入到命名空间std中。
如果您使用不带std的<cname>头中的名称,则您的程序依赖于未指定的要求。
这在C++03和更早的版本中是不同的,在std名称空间中应该只出现名称。然而,现实情况是,许多实现只是将C标准库头<名称.h>的内容注入到std中,因此这在C++11中得到了适应。C++03标准中的相应部分(§17.4.1.2/4)说:
如
/IEC9899:1990编程语言C(第7条)或ISO/IEC:1990编程语言-C修正案1: C完整性(第7条)所规定,每个标题cname的内容应与相应标题名称
.h的内容相同。然而,在C++标准库中,声明和定义(除了在C中定义为宏的名称)在名称空间std的名称空间范围(3.3.5)内。
此外,使用std::限定名称有助于避免冲突-如果您完全限定它,您将确切地知道您将获得什么。如果你真的要做using namespace std或using std::something,至少要在尽可能小的范围内做。
发布于 2012-10-30 05:34:47
在C++11中,对于在C++标准中显式命名的C标头,以下条件成立:
std::命名空间。std::命名空间所必需的,并且允许将它们添加到全局命名空间。发布于 2012-10-30 05:42:39
在<cstdint>头的std名称空间中包装东西的原因是为了避免名称冲突,当名称冲突发生时,这是非常令人不快的。但是,在这种情况下,这些类型不太可能在其他地方找到。因此,我将使用<stdint.h>,特别是因为这个特性在被添加到C++之前就已经在C中引入了,因此<stdint.h>头文件比<cstdint>更早,因此在较旧的编译器中可用。
如果您已经决定要在全局名称空间中使用这些名称,您还应该更喜欢<stdint.h>而不是<cstdint>,然后是using namespace std,因为后者会将您已经包含的其他std头中的所有其他<cfoo>内容也转储到全局名称空间中,这可能不是您想要的,因为许多其他标准名称比uint8_t更容易发生冲突。
https://stackoverflow.com/questions/13129945
复制相似问题