使用“std”的标准惯例

时间:2009-12-25 17:32:35

标签: c++ using

  

完全重复: Do you prefer explicit namespaces or ‘using’ in C++?

这些是使用任何命名空间的首选约定?

using namespace std;

using std::cin;
using std::cout;

在代码中需要时调用函数?

std::cout<<"Hello World!"<<std::endl;

9 个答案:

答案 0 :(得分:14)

给出了一个非常好的解释here

第一种风格,即使用命名空间,无论如何都会破坏命名空间的整个目的。除了小代码片段之外,你永远不应该使用它。 (我也不在那里使用它!:D)

第二个太冗长了。不实用。

我个人喜欢第三种风格,即输入完全限定名称(例如std :: cout)。

请记住,代码的读取次数比写入次数多得多。使用完全限定名称IMO使您的代码更具可读性。

答案 1 :(得分:12)

之前已经多次询问过,但我的SO搜索似乎暂时抛弃了我。基本上是:

  • 永远不要在头文件中放置任何类型的using指令 - 这样做会污染您的代码并引入各种难以追踪的错误。

  • 首选使用声明,如using std::string,在大量使用此类型的实现(.cpp)文件中。

  • 作为最后的手段,请使用using namespace std,但仅限于实施文件 - 为方便起见,我在SO上的可编辑代码帖子中使用它。

答案 2 :(得分:8)

这是我在同一主题上写的另一个答案的修改版本。足够的这些问题,也许我最终会有一个明确的帖子;)

主要问题是名称冲突,因为如果你的代码中有一个名为cout的变量而你是using namespace std;,那么你的意思就不明确了。它不仅仅是cout。还会包含countreverseequal,这些都是常见的标识符。

忽略编译器的所有问题,任何来阅读代码的人都会遇到问题。这些额外的5个字符可确保维护代码的下一个人确切知道您的意思。


值得注意的是,你永远不应该把

using namespace std;

在头文件中,因为它可以传播到包含该头文件的所有文件,即使他们不想使用该命名空间。这里的另一个问题是,还不清楚std命名空间是否已被导入,因此维护者(或者你在3个月的时间内)添加一个变量,其名称与包含在同一编译单元中的一些不起眼的std函数相同。然后花费一个小时试图找到编译错误的原因。

在大多数情况下,使用像

这样的东西是非常有益的
using std::swap

好像有一个专门版本的swap,编译器会使用它,否则它会回到std::swap。如果你致电std::swap,你总是使用基本版本,它不会调用专用版本(即使它存在)。

使用pimpl idiom获取示例代码。默认副本可以复制实际实现中的所有数据,其中所有需要做的就是交换指针。使用专门的交换可以节省大量的执行时间,精心设计的库应该专门化它。


总之,

  • 始终优先于using std::swap

  • std::swap()
  • 由于传播而不惜一切代价避免使用标头中的using namespace std,请尽量避免在实施文件中使用它。

  • 在每个文件的顶部都有数千个using std::foo,这是不可取的。最多使用它用于常用类。

其他一切都是意见。

答案 3 :(得分:3)

我个人更喜欢第三种选择。看看这个:

namespace A { int a=0; }
namespace B { int a=0; }

并将其用作:

using namespace A;
using namespace B;
using namespace std;

cout<<a<<endl; //error here!

相反,如果你可以说,

std::cout<<B::a<<std::endl; //No problem, more readable

虽然输入代码可能需要更多时间,但第二个和第三个选项更多(种类)首选。

答案 4 :(得分:1)

这是一个风格问题,但有一件事:你永远不应该将命名空间导入全局范围。 e.g:

#include <iostream>
using namespace std; // Pollution!

int main()
{
    ....
}

如果要导入命名空间,只需将其导入到您正在使用的范围:

#include <iostream>

int main()
{
    using namespace std; // Good!
    ....
}

答案 5 :(得分:1)

我只想指出using namespace foo是作用域的。例如:

#include <iostream>
#include <vector>
//...
for (int i=0; i<10; ++i)
{
    using namespace std;
    cout << i << endl;
}
vector v; // won't compile

如果谨慎使用,using namespace std可能同时有用且无害。

答案 6 :(得分:1)

我总是列出完整的命名空间。它提高了可读性,让其他人知道您的功能和数据来自哪里。在阅读其他人的代码时,using非常烦人,特别是当我试图学习某些东西时,因为我无法判断它是否是该命名空间或其他命名空间的一部分。就像其他明智的人所说的那样,它确实击败了命名空间的全部意义,不是吗?关键是要将所有内容分开,并为数据和逻辑赋予意义。

记住一个好的命令:最重要的人是使用该程序的客户;第二个最重要的是其他程序员要么维护要么试图从你的代码中学习;最重要的是你。 : - )

答案 7 :(得分:0)

当命名空间为std时,建议写出完全限定名称是一回事,其中std :: only只添加5个额外字符。当名称空间堆栈时,这是一个完整的问题,而你正面临着写下这样的东西:

if (NumberOfInstances > 0 && (code_type == MyNamespace::MyLongButMeaningfulClassName::EnumDefinedWithinClass::CODE_GREEN ||
                              code_type == MyNamespace::MyLongButMeaningfulClassName::EnumDefinedWithinClass::CODE_YELLOW)) {

特别是如果你有一个公司风格的guidline限制行到80个字符,你又添加了几个缩进。像这样的东西掩盖了所有措辞背后的代码逻辑。此时,为了便于阅读,您开始欣赏使用和/或本地命名空间别名。

答案 8 :(得分:-4)

无论你喜欢什么。真的,没关系。 但是,大多数代码片段都使用

using namespace std;