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 ++良好的编码风格 - 始终完全限定库类型?的主要内容,如果未能解决你的问题,请参考以下文章