0

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

using namespace std;在为 C++ 提供的代码示例中使用 Stack Overflow 似乎达成了共识。我最初是这样学的,后来从来没有教过为什么这是一个问题。

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

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

4

6 回答 6

7

我认为答案是“这并不重要”。这是一个微妙之处,很容易在以后发现和纠正。

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

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

虽然在这种情况下我有点同意你的看法。

添加std::前缀不会有什么大不了的,它会相当多地揭开命名空间的神秘面纱。using namespace std实际上更难正确解释和理解。

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

于 2009-07-26T19:36:19.160 回答
3

对于初学者,IMO,理解函数、类、条件等概念对他们来说更为重要。显式的命名空间声明只是阻碍。

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

于 2009-07-26T19:19:37.243 回答
2

我认为它简化了它。当您是初学者时,您需要了解变量、控制结构、方法/函数等内容,以及 C/C++ 中的指针和引用等内容。在掌握适用于每种编程语言的基础知识之前,您不必担心命名空间和打包之类的事情。

于 2009-07-26T19:19:34.093 回答
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. 只有在将事物放入单独的命名空间或将事物从一个命名空间注入另一个命名空间时,才需要理解命名空间概念本身。这些都是更高级的主题,可以保存到以后。

于 2009-07-27T07:40:36.950 回答
0

我不同意您的问题的前提,即以尽可能快的方式(或至少以最少的打字量)回答问题在任何方面都是具有教学意义的。您不能总是对诸如“不包括错误检查”或“也许您不想使用全局名称空间”之类的问题提出免责声明。底线是,对问题的回答不一定是编写解决方案的最佳方法的示例。

于 2009-07-26T19:21:23.200 回答
0

然而,在初学者阶段这并不是一件紧迫的事情 - 他们应该意识到,

namespace A
{
int a;
}

namespace B
{
int a;
}

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

于 2009-07-27T07:27:19.253 回答