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

tyr*_*dis 10 c++ stl c++11

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

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

我的问题是:使用cstdint中的typedef的推荐方法是什么.有没有命名空间?有什么优点或缺点?或者只是风格问题?

所以变种a):

#include <cstdint>
std::uint8_t n = 21;
Run Code Online (Sandbox Code Playgroud)

RESP:

#include <cstdint>
using std::uint8_t;
uint8_t n = 21;
Run Code Online (Sandbox Code Playgroud)

或变体b):

#include <cstdint>
uint8_t n = 21;
Run Code Online (Sandbox Code Playgroud)

Sjo*_*erd 7

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

  • <foo.h> 版本需要一个实现来将它们添加到全局命名空间中,并允许将它们添加到std::命名空间中。

  • <cfoo> 版本需要一个实现才能将它们添加到std::命名空间中,并允许将它们添加到全局命名空间。


Jos*_*eld 6

首选名称std空间中声明的名称.原因在§17.6.1.3/ 4(ISO/IEC 14882:2011(E),C++ 11)中给出:

除第18条至第30条和附件D中所述外,每个标题cname的内容应与相应标题名称的内容相同.h,如C标准库(1.2)或C Unicode TR中所指定,视情况而定,如如果包括在内 但是,在C++标准库中,声明(在C中定义为宏的名称除外)在命名空间的命名空间范围(3.3.6)内std.未指定是否首先在全局命名空间范围内声明这些名称,然后std通过显式使用声明将其注入命名空间(7.3.3).

如果您使用<c名称>标题中没有的名称std,则您的程序依赖于未指定的要求.

这在C++ 03及更早版本中是不同的,其中名称只应出现在std命名空间中.然而,现实情况是,许多实现是简单地注入C标准库头的内容<命名.h>std等这被容纳在C++ 11.C++ 03标准的相应部分(第17.4.1.2/4节)说:

除第18至27条所述外,每个标题cname的内容应与ISO/IEC 9899:1990编程语言C(第7条)或ISO/IEC:1990中规定的相应标题名称的内容相同..h编程语言-C修订1:C完整性,(第7条),视情况而定,如同包含一样.但是,在C++标准库中,声明和定义(在C中定义为宏的名称除外)在命名空间的命名空间范围(3.3.5)内std.

除此之外,符合条件的名称std::有助于避免碰撞 - 如果您完全符合条件,您就知道自己获得了什么.如果你真的要做,using namespace std或者using std::something至少在尽可能小的范围内做到这一点.