C++良好的编码风格 - 始终完全限定库类型?

fle*_*esh 5 c++ coding-style

在C++中通常被认为是良好的编码风格,您使用标准库中的类型?例如,如果我有一个using namespace std;指令,你仍然希望看到类型完全合格的库类型:std::string或者只是string用作类型标识符是可以接受的吗?

如果你完全符合资格,你能否理解其背后的理由?

sde*_*sse 14

完全符合头文件.导入.cpp文件中的命名空间.

保持全局命名空间不被简单的#include混乱

  • 我会说可选择在源文件中导入命名空间,但这里的关键和正确点永远不会在头文件中放置"using namespace"声明. (2认同)

Ark*_*nez 13

我更喜欢使用:

using std::string;
string whatever;
Run Code Online (Sandbox Code Playgroud)

而不是完全带来命名空间.

在任何情况下,库开发人员都应该避免使用与标准类型冲突的类型名称,尽管string可能很常见.

对于标准以外的库我喜欢在嵌套命名空间不太长的情况下进行限定,如果它只是将其定义为包含库名称或类似名称的有意义的名称.

  • 选择已在您自己的库中为标准定义的名称是一个非常糟糕的主意.不是非法的,只是一个坏主意,任何读取矢量的人都会想到std :: vector. (4认同)
  • 命名空间的重点在于您不必担心其他库使用的名称,即使是标准名称. (2认同)

cat*_*try 6

重点应该是避免混淆并生成清晰的代码.在某些情况下,省略名称空间可能会混淆函数或类的来源,但添加始终完整的名称空间可能会变得无法忍受.

  • 避免using namespace在头文件中
  • using namespace在"明显"库中使用源代码(例如std,或在测试程序中测试的库)
  • 您可以在源代码中为命名空间设置别名,以使其简短易读:

namespace fs = boost::filesystem;
bool fileExists = fs::exists(fs::path(filePath));
Run Code Online (Sandbox Code Playgroud)

编辑,为了完整性: using namespace在头文件中以非显而易见的方式污染具有导入的名称空间的源文件('nuf解释此已经存在于此线程中).


Jer*_*fin 5

就其价值而言,您可以通过使用 using 指令拉取名称空间来做一些事情,通过限定名称则无法做到这一点。规范示例可能是编写通用排序函数。如果swap已为正在排序的类型定义了a ,您想使用它,但如果它没有swap自己的 a,您想使用std::swap.

为此,您可以编写如下代码:

using namespace std;
// ...
template <class T>
void my_sort(std::vector<T> &x) {
    // ...
    if (x[j] < x[k])
        swap(x[j], x[k]);
Run Code Online (Sandbox Code Playgroud)

你也可以更有选择性:

template <class T>
void my_sort(std::vector<T> &x) {

    using std::swap;

    if (x[j] < x[k])
        swap(x[j], x[k]);
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,如果swap正在排序的任何类型的命名空间中有 a ,它将通过参数相关查找找到。如果没有,std::swap将会找到,因为您已使用 using 指令/using 声明使其可见。在任何情况下,使用完全限定的名称都不会实现通常被认为是最理想的行为。