首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在<cstdint>中使用带或不带命名空间的类型

在<cstdint>中使用带或不带命名空间的类型
EN

Stack Overflow用户
提问于 2012-10-30 05:27:39
回答 5查看 3.2K关注 0票数 15

在C++11中,我可以选择使用在中定义的类型,是否使用名称空间std::

至少我的编译器(g++ 4.7)接受这两种变体。

我的问题是:使用cstdint中的typedefs的推荐方式是什么。使用还是不使用名称空间?有什么优势或劣势?或者这只是一个风格问题?

所以变体a):

代码语言:javascript
复制
#include <cstdint>
std::uint8_t n = 21;

响应:

代码语言:javascript
复制
#include <cstdint>
using std::uint8_t;
uint8_t n = 21;

或变体b):

代码语言:javascript
复制
#include <cstdint>
uint8_t n = 21;
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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 stdusing std::something,至少要在尽可能小的范围内做。

票数 12
EN

Stack Overflow用户

发布于 2012-10-30 05:34:47

在C++11中,对于在C++标准中显式命名的C标头,以下条件成立:

  • An implementation is required for the versions将它们添加到全局命名空间,并且允许将它们添加到std::命名空间。
  • An implementation是版本将它们添加到std::命名空间所必需的,并且允许将它们添加到全局命名空间。
票数 7
EN

Stack Overflow用户

发布于 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更容易发生冲突。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13129945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档