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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++良好的编码风格 - 始终完全限定库类型?相关的知识,希望对你有一定的参考价值。

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

如果你完全合格,你能解释其背后的基本原理吗?

答案

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

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

另一答案

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

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

另一答案

如果您没有完全符合条件,那么在将内联方法从标题移动到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.
     }
}
另一答案

我更喜欢使用:

using std::string;
string whatever;

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

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

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

另一答案

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

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

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

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

另一答案

只是为了它的价值,你可以通过使用using指令来提取命名空间来做一些事情,你无法通过限定名称来完成。规范示例可能是编写通用排序函数。如果已为要排序的类型定义了swap,则需要使用它,但如果它没有自己的swap,则需要使用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]);

你也可以更有选择性:

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声明使其可见。在任何情况下,使用完全限定名称将无法实现通常被认为是最理想的行为。

另一答案

namespace基本上是为了最小化冲突符号名称,如函数,类和变量。你可以使用string而不是std::string,除非你自己的图书馆在自己的空间里有string。我几乎没有像std那样使用非常常见的命名空间。

另一答案

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

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

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

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

另一答案

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

另一答案

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

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

以上是关于C ++良好的编码风格 - 始终完全限定库类型?的主要内容,如果未能解决你的问题,请参考以下文章

形成良好的编码风格应从哪些方面做起

养成良好的编程风格

编写高质量代码思想为源

什么是编码风格?

软件工程中编码风格应遵守的规则?

C语言中的main()函数返回值是啥?