这些是使用任何命名空间的首选约定?
using namespace std;
或
using std::cin;
using std::cout;
或
在代码中需要时调用函数?
std::cout<<"Hello World!"<<std::endl;
答案 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
。还会包含count
,reverse
和equal
,这些都是常见的标识符。
忽略编译器的所有问题,任何来阅读代码的人都会遇到问题。这些额外的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;