我们应该教初学者使用全局命名空间吗?

时间:2009-07-26 19:16:36

标签: c++ namespaces global-namespace

注意:我自己就是初学者。这个问题集中在C ++的使用上,因为这是我遇到的唯一语言。

在Stack Overflow上似乎已经就为C ++提供的代码示例中使用using namespace std;达成了共识。我最初是以这种方式学习的,并且从未教过为什么以后这是一个问题。

我只是想知道为什么人们在他们的示例代码中使用前缀std ::有问题。声明全局命名空间似乎是反复无常的,特别是因为许多提问者将示例中的代码复制+粘贴到他们的IDE中。命名空间是一个高级编程概念,但我认为最好在std ::之前加上前缀,然后在初学者询问时解释它。

为什么初学者可以接受这种用法?

6 个答案:

答案 0 :(得分:7)

我认为答案是“它并不重要”。这是一个微妙的,以后很容易拿起并纠正。

我所知道的每个初学者的编程文本都进行了大量的简化,并使用大量的手工操作来隐藏很多正在发生的事情(“这条线是神奇的。只需键入它,我们就会讨论它的作用以后“)。

初学者有足够的担心,而不必完全理解他们的代码中的所有内容,以及如何/为什么它是坏的,所以这些简化往往是好事。

虽然在这种情况下我很同意你。

添加std::前缀不会有什么大不了的事,它会使名称空间显得神秘。 using namespace std实际上更难以解释和理解。

另一方面,它会占用空间并为代码增加噪音,应尽可能简洁明了。

答案 1 :(得分:3)

对于初学者,IMO来说,了解函数,类,条件等概念对他们来说更为重要。显式名称空间声明只会妨碍。

一旦他们理解了这些基本概念,向他们解释命名空间的好处就不那么难了。

答案 2 :(得分:2)

我认为这简化了它。当你是初学者时,你需要学习变量,控制结构,方法/函数以及C / C ++之类的东西,比如指针和引用。在具备适用于每种编程语言的基础知识之前,您不必担心命名空间和包装等问题。

答案 3 :(得分:2)

总有一个全局命名空间,你无法摆脱它,而且每个其他命名空间都嵌套在其中,你无法真正避免它。

真正的问题是你放入了什么。我不认为初学者将其标识符直接放在全局命名空间中是一个坏主意。实际上,如果你正在编写main函数,那么我认为没有理由不使用你认为合适的所有全局命名空间。只有在为其他人编写库时,才能最大限度地减少对全局命名空间的影响,通常是将非常少量(一个?)的命名空间注入其中。

using namespace std;是否是个好主意是一个单独但相关的主题。

我个人认为初学者永远不应该using namespace std;。根据定义,他们是那种不会知道std命名空间可能包含的每个标识符的用户,并且部分由名称冲突引起的错误消息可能会非常混乱。

例如,右边(或错误!)包含以下“初学者样式”代码会产生关于count不明确的错误。专家修复代码没有问题。初学者可能会难过。

using namespace std;
int count = 3;
int main()
{
    cout << count << endl;
    return 0;
}

此外,使用using namespace std;要求您引入命名空间这个词以及命名空间的概念,或者将该指令捏造为“必需的魔法”或其他类似物。没有它,您可以说<string>头文件中C ++提供的标准字符串类型的名称是std::string。只有在将事物放入单独的命名空间或将事物从一个命名空间注入另一个命名空间时,才必须理解命名空间概念本身。这些都是更高级的主题,可以保存到以后。

答案 4 :(得分:0)

我不同意你的问题的前提,即尽可能以最快的方式回答问题(或者至少以最少的打字量)以任何方式说明。你不能经常在诸如“不包括错误检查”或“也许你不想使用全局命名空间”之类的问题上放置免责声明。最重要的是,问题的答案并不一定意味着是编写解决方案的最佳方式的一个例子。

答案 5 :(得分:0)

然而,这不是初学者阶段的紧迫问题 - 他们应该意识到这一点,

namespace A
{
int a;
}

namespace B
{
int a;
}

A :: a和B :: a是两个不同的东西