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

时间:2009-12-09 14:33:01

标签: c++ coding-style

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

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

11 个答案:

答案 0 :(得分:14)

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

使全局命名空间不会被简单的#include

弄得乱七八糟

答案 1 :(得分:13)

我更喜欢使用:

using std::string;
string whatever;

而不是完全使用命名空间。

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

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

答案 2 :(得分:6)

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

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

实施例

namespace fs = boost::filesystem;
bool fileExists = fs::exists(fs::path(filePath));

编辑,完整性: 头文件中的using namespace非显而易见的方式污染具有导入名称空间的源文件(此线程中已经对此进行了详细解释)。

答案 3 :(得分:4)

只是为了它的价值,你可以通过使用一个你无法通过限定名称执行的using指令来提取名称空间来做一些事情。规范示例可能是编写通用排序函数。如果已为要排序的类型定义了swap,则您希望使用该{1}},但如果它没有自己的swap,则需要使用std::swap。< / p>

要完成此任务,您可以编写如下代码:

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

你也可以更具选择性:

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

    using std::swap;

    if (x[j] < x[k])
        swap(x[j], x[k]);

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

答案 4 :(得分:1)

通常,当我处理头文件时,我将完全限定命名空间而不是使用using namespace x。源文件可能不希望假定该命名空间,您不应强制它包含您的头文件的源文件。

我同时执行using namespace x并完全限定名称空间,具体取决于我是否会在源文件中多次重复使用该类型的个人判断调用。

答案 5 :(得分:1)

基本上引入了

namespace来最小化冲突符号名称,例如函数,类和变量。您可以使用string而不是std::string,除非您自己的库在其自己的空间中有string。我几乎没有使用像std这样的非常常见的命名空间。

答案 6 :(得分:1)

我确实倾向于遵守两条规则:

  • 在头文件中,您希望使用完整命名空间限定类型名称,并且永远不希望放置类似using namespace std;的内容,因为这会因为您需要跟踪的意外命名冲突而导致有趣的问题凌晨1点。
  • 在实现文件中,我倾向于使用using std::string;或类似的方法从其他命名空间中提取我使用的符号。实际上,我并不是100%与此一致,因为我经常不拉入std命名空间,但确实拉入了项目命名空间,但这是个人偏好。但是,从来没有把using namespace somethingorother;置于任何#include之上。

答案 7 :(得分:0)

完全主观的问题: 我会说只使用字符串是可以接受的。 IDE /编译器非常聪明,可以找出你的意思。如果您具有相同名称的对象,例如2个字符串类型。然后你有一个不同的问题,因为编译器不知道你的意思,编码器不会知道你的意思。

不使用库名称的其他原因是因为代码混乱: 在C#system.xml.xmltextreader中只是矫枉过正。 XmlTextReader足以承受它的本质。它所在的位置几乎不是问题

答案 8 :(得分:0)

一般来说,我更喜欢(1)使用像using std::string; string hello;这样的指令,正如Jimenez先前所说的那样; (2)我还使用匿名命名空间,随后使用 using namespace directive 将所有名称导入我的匿名命名空间,如下所示 namespace { using namespace std; // or using std::string string blah_blah_blah; }

答案 9 :(得分:0)

我总是完全符合标题。我从不在标题中加上“using ...”语句。

我的偏好是完全符合实现文件的资格,但是如果组织标准是在实现文件中包含“using ...”语句,我会这样做,

答案 10 :(得分:0)

如果您没有完全符合条件,那么在将内联方法从标题文件移动到CPP文件或反之亦然时,您会非常麻烦,并且您肯定希望在项目中使用一种样式。

否则它没有问题,尽管现有使用声明,我有时也符合资格。在标题中,这是一个问题,除非它在范围内:

// somefile.h
namespace VisionMap
{
     namespace X
     {
         using namespace Y;   // Does not impact the header's user, 
                              // as would if it was in the global scope.
     }
}