为什么“using namespace std;”被认为是不良实践?

51 浏览
0 Comments

为什么“using namespace std;”被认为是不良实践?

我听说using namespace std;是不好的习惯,我应该直接使用std::coutstd::cin。为什么呢?这样做是否会冒着与std命名空间中的某些东西重名的风险呢?

admin 更改状态以发布 2023年5月22日
0
0 Comments

情况可以变得更糟,比Greg所写的还要糟糕!

库Foo 2.0可能引入一个函数Quux(),它对于你某些对Quux()的调用比你的代码多次调用的bar::Quux()更明确。然后你的代码仍可以编译,但它会默默地调用错误的函数,不知道会发生什么。这是情况能变得最糟糕的程度。

请记住,std命名空间有大量的标识符,其中许多是非常常见的(例如listsortstringiterator等),非常有可能在其他代码中出现。

如果你认为这不太可能:在Stack Overflow上曾经问过一个问题,情况几乎就是这样(由于省略了std::前缀而导致调用了错误的函数),这是我回答过这个问题约半年后发生的。 这里是另一个更近期的类似问题。

所以这是一个真正的问题。


这里还有一个数据点:许多年前,我也觉得在标准库中的每个东西都需要加上std::前缀很烦人。然后我在一个项目中工作,决定在开始时禁止使用using指令和声明,除了函数作用域。猜猜怎么着?我们大多数人在很短的时间内习惯了写前缀,在更多的时间里,我们甚至认为它使代码更可读。原因是: 无论你喜欢简洁还是冗长的文学风格,前缀客观上增加了代码的清晰度。不仅编译器,而且你也会发现它更容易看出引用哪个标识符。

在十年内,该项目的代码行数已经增长到数百万行。由于这些讨论一遍又一遍地出现,我曾经好奇使用(允许的)函数作用域 using 在该项目中实际上被使用了多少次。我在源代码中使用 grep 查找它,只发现有一两十个地方使用了它。对我来说,这表明,一旦尝试过,即使在允许使用的情况下,开发人员也不会发现 std:: 足够痛苦,以至于他们每 10 万行代码只使用一次 using 指令。

总之:显式地给所有东西加前缀不会造成任何伤害,很快就能习惯,且具有客观优势。特别是,它使代码更容易被编译器和人类读者解读,而这应该是编写代码时的主要目标。

0
0 Comments

考虑两个叫Foo和Bar的库:\n

using namespace foo;
using namespace bar;

\n一切都很好,你可以从Foo调用Blah(),从Bar调用Quux(),没有任何问题。但有一天,你升级到了Foo 2.0的新版本,它现在提供了一个名为Quux()的函数。现在你有了一个冲突:Foo 2.0和Bar都将Quux()导入到你的全局命名空间中。这将需要一些修复工作,特别是如果函数参数恰好匹配的话。\n如果你使用了foo::Blah()bar::Quux(),那么foo::Quux()的引入将是一个非事件。

0