Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;良好的编码风格-始终完全限定库类型? 通常在C++中使用什么样的编码风格,在这里使用标准库中的类型?例如,如果我有一个使用名称空间std指令您是否仍然希望看到库类型完全符合以下条件:std::string,或者只使用string作为类型标识符是可以接受的_C++_Coding Style - Fatal编程技术网

C++;良好的编码风格-始终完全限定库类型? 通常在C++中使用什么样的编码风格,在这里使用标准库中的类型?例如,如果我有一个使用名称空间std指令您是否仍然希望看到库类型完全符合以下条件:std::string,或者只使用string作为类型标识符是可以接受的

C++;良好的编码风格-始终完全限定库类型? 通常在C++中使用什么样的编码风格,在这里使用标准库中的类型?例如,如果我有一个使用名称空间std指令您是否仍然希望看到库类型完全符合以下条件:std::string,或者只使用string作为类型标识符是可以接受的,c++,coding-style,C++,Coding Style,如果您完全符合资格,您能解释其背后的理由吗?我更喜欢使用: using std::string; string whatever; 而不是完全引入名称空间 在任何情况下,库开发人员都应该避免使用与标准名称冲突的类型名称,尽管string可能非常常见 对于标准以外的库,如果嵌套名称空间不太长,如果只是将其定义为包含库名称或类似名称的有意义的名称,则我希望对其进行限定。通常,在处理头文件时,我将完全限定名称空间,而不是使用使用名称空间x。源文件可能不希望假定该名称空间,并且不应将其强制应用于包含头

如果您完全符合资格,您能解释其背后的理由吗?

我更喜欢使用:

using std::string;
string whatever;
而不是完全引入名称空间

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


对于标准以外的库,如果嵌套名称空间不太长,如果只是将其定义为包含库名称或类似名称的有意义的名称,则我希望对其进行限定。

通常,在处理头文件时,我将完全限定名称空间,而不是使用
使用名称空间x
。源文件可能不希望假定该名称空间,并且不应将其强制应用于包含头文件的源文件


我使用namespace x执行
,并根据个人判断调用来完全限定名称空间,判断是否要在源文件中多次重复使用该类型

在头文件中完全限定。在.cpp文件中导入命名空间


防止全局名称空间被简单的#include

名称空间凌乱
的引入基本上是为了尽量减少函数、类和变量等符号名称之间的冲突。您只需使用
string
而不是
std::string
就可以了,除非您自己的库在自己的空间中有
string
。实际上,我没有使用非常常见的名称空间,比如
std

完全主观的问题: 我想说,只要使用字符串就可以了。IDE/编译器足够聪明,能够理解您的意思。如果有同名的对象,例如2种字符串类型。然后你会遇到另一个问题,因为编译器不知道你的意思,而程序员也不知道你的意思

不使用库名称的另一个原因是代码混乱:
在C#system.xml.xmltextreader中,这是一种过火的行为。XmlTextReader足以理解它是什么。它的位置几乎从来都不是问题所在

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

  • 在头文件中,您希望使用完整的名称空间限定类型名称,并且永远不要使用名称空间std放置类似
    因为这可能/将导致有趣的问题,因为您需要在凌晨1点跟踪意外的命名冲突
  • 在实现文件中,我确实倾向于使用std::string从其他名称空间中引入我使用的符号或类似。事实上,我并不是100%同意这一点,因为我通常不引入std名称空间,而是引入项目名称空间,但这是我个人的偏好。永远不要,永远不要把
    使用名称空间放在其他地方高于任何#包括
一般来说,我更喜欢(1)使用指令,比如
使用std::string;串你好如希门尼斯之前所述;(2) 我还使用匿名名称空间,随后使用usingnamespace指令将所有名称导入我的匿名名称空间,如下所示
名称空间{
使用命名空间std;//或使用std::string
弦乐等等;

}

仅就其价值而言,通过使用using指令拉取名称空间可以做一些事情,但通过限定名称不能做到这些。规范示例可能是编写一个通用排序函数。如果已为正在排序的类型定义了
交换
,则您希望使用该交换,但如果它没有自己的
交换
,则您希望使用
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]);
使用名称空间std;
// ...
模板
void my_排序(std::vector&x){
// ...
if(x[j]
您也可以更具选择性:

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

    using std::swap;

    if (x[j] < x[k])
        swap(x[j], x[k]);
模板
void my_排序(std::vector&x){
使用std::swap;
if(x[j]

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

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

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

namespace fs = boost::filesystem;
bool fileExists = fs::exists(fs::path(filePath));
编辑,以确保完整性:
在头文件中使用名称空间
会以一种不明显的方式污染导入名称空间的源文件(“此线程中已对此进行了nuf解释)。

我始终在头文件中完全限定。我从未在头文件中放入“using…”语句


我的偏好是在实现文件中也完全限定,但是如果组织标准包含“使用…”实现文件中的语句我将这样做,

如果您没有完全限定,那么在将内联方法从头文件移动到CPP文件或从CPP文件移动到头文件时会遇到很大的麻烦,而且您肯定希望在项目中使用一种样式

否则就没问题了,尽管存在using语句,有时我还是会对其进行限定
// 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.
     }
}