1
1905
这与表演一点关系都没有。但是考虑一下:您使用的是两个名为foo和bar的库:
一切正常,你可以打电话
如果你曾经用过
|
2
1233
我同意一切 Greg wrote ,但我想补充一点: 比格雷格说的还要糟!
库foo 2.0可以引入一个函数,
记住
如果你认为这不太可能:有
a question asked
在堆栈溢出中,几乎完全发生了这种情况(由于省略而调用了错误的函数
这里还有一个数据点:许多年前,我还发现在标准库的所有内容前面加上前缀会让人恼火
在十年的时间里,这个项目增加到了几百万行代码。由于这些讨论一次又一次地出现,我曾经好奇(允许的)功能范围的频率
最重要的是:明确地预加前缀不会造成任何伤害,很少需要习惯,并且有客观的优势。尤其是,它使编译器和人类读者更容易理解代码,这可能是编写代码时的主要目标。 |
3
346
推杆的问题
但是,您可以在(private).cpp文件中随意放置using语句。 请注意,有些人不同意我这样的说法,因为尽管cpp文件中的using语句 更好的 而不是在头文件中(因为它不影响包含头文件的人),他们认为它仍然不是 好的 (因为依赖于代码,它可能会使类的实现更难维护)。 This FAQ topic 说,
常见问题解答提出了两种备选方案:
|
4
214
我最近遇到一个关于 Visual Studio 2010 . 结果发现几乎所有的源文件都有这两行:
很多 Boost 特性进入了C++0X标准,VisualStudioStudio 2010有很多C++ 0x特性,所以这些程序突然没有编译。
因此,避免
|
5
185
短版本:不要在头文件中使用全局声明或指令。在实现文件中随意使用它们。以下是Herb Sutter和Andrei Alexandrescu在 C++ Coding Standards (大胆强调是我的):
|
6
112
不应该在全局范围内使用using指令,尤其是在头中。但是,在某些情况下,即使在头文件中也适用:
这比明确的条件要好(
|
7
88
不要在全球范围内使用它只有当 全球使用 . 因为:
你可以在本地使用
继续在本地(几乎)免费使用它。当然,这会阻止你重复
本地使用的成语
在C++ 03中有一个成语——样板代码——用于实现一个
这有以下魔力:
有了C++ 11,就没有理由再使用这个模式了。实施
|
8
73
|
9
40
经验丰富的程序员使用任何能解决他们问题的方法,避免任何能产生新问题的方法,并且出于这个确切的原因,他们避免使用头文件级别的指令。 经验丰富的程序员还试图避免对源文件中的名称进行完全限定。造成这种情况的一个次要原因是,在足够少的代码时编写更多的代码并不优雅。 除非有充分的理由 . 这主要是因为关闭了依赖于参数的查找(ADL)。 这些是什么 好理由 ?有时程序员明确地想关闭ADL,而有时他们想消除歧义。 所以下面是可以的:
|
10
39
另一个原因是惊喜。
如果我看见
我想这是什么
|
11
36
我同意它不应该在全球范围内使用,但是在本地使用并不那么邪恶,就像在
在这个例子中,我们解决了可能的名称冲突和由它们的组成引起的歧义。
在此处显式声明的名称(包括使用声明声明声明的名称,如
|
12
26
我也认为这是一种不好的做法。为什么?就在一天,我认为名称空间的功能是划分东西,所以我不应该把所有东西都扔到一个全局包中。
但是,如果我经常使用“cout”和“cin”,我会写:
|
13
21
很高兴看到代码并知道它的作用。如果我看见
现在以一百万行代码为基础,这并不是特别大,你在搜索一个bug,这意味着你知道在这一百万行中有一行代码不能做它应该做的。
如果你是一名教师,而且从不需要为生活而写和维护任何代码,那么这是其中一个看起来非常好的主意。我喜欢在以下地方看到代码:(1)我知道它做什么;(2)我相信编写代码的人知道它做什么。 |
14
20
一切都是为了管理复杂性。使用名称空间将拉入您不想要的东西,因此可能会使调试更加困难(我说可能)。到处使用std::很难阅读(更多的文本和所有这些)。 马的课程-管理你的复杂性如何你能最好地和感觉能力。 |
15
17
|
16
17
同时使用多个名称空间显然是造成灾难的原因,但只使用名称空间
所以只要把它们当作保留名称,比如“int”或“class”,就可以了。 人们应该停止对这件事如此无礼。你的老师一直都很好。只需使用一个名称空间;这是首先使用名称空间的全部要点。不能同时使用多个。除非是你自己的。因此,重新定义也不会发生。 |
17
16
考虑
注意,这是一个简单的例子,如果您有包含20个include和其他导入的文件,那么您将有大量的依赖项来解决这个问题。更糟糕的是,根据冲突的定义,您可以在其他模块中获得不相关的错误。 这并不可怕,但如果不在头文件或全局命名空间中使用它,就可以省去自己的麻烦。在非常有限的范围内完成这项工作可能没问题,但我从来没有遇到过输入额外的5个字符来说明我的函数来自何处的问题。 |
18
11
命名空间是命名范围。命名空间用于对相关声明进行分组并保持独立 项目分开。例如,两个单独开发的库可以使用相同的名称来引用不同的 项,但用户仍然可以同时使用这两个项:
重复命名空间名称可能会分散读者和作者的注意力。因此,这是可能的 声明来自特定命名空间的名称在没有显式限定的情况下可用。例如:
名称空间为管理不同库和不同版本的 代码。特别是,它们提供了程序员如何明确地引用非本地的 姓名。 源代码:C++程序设计语言综述 作者:Bjarne Stroustrup |
19
11
澄清问题的具体例子。假设您有两个库,foo和bar,每个库都有自己的名称空间:
现在假设您在自己的程序中同时使用foo和bar,如下所示:
在这一点上,一切都很好。当你运行你的程序时,它会“做一些事情”。但后来你更新了这个工具栏,让我们假设它已经改变为:
此时,您将得到一个编译器错误:
所以你需要做一些维护来澄清你的意思是什么(即
但是想象一下另一种情况,酒吧变成了这样:
此时你的电话
当您使用一个名称空间时,您会冒这样的风险,这就是为什么人们不愿意使用名称空间的原因。名称空间中的内容越多,冲突的风险就越大,因此使用名称空间std(由于该名称空间中的内容数量多)的人可能比使用其他名称空间更不舒服。 最终,这是可写性与可靠性/可维护性之间的权衡。可读性也可以考虑,但我可以看到这两种情况的论据。通常我会说可靠性和可维护性更重要,但在这种情况下,您将经常为相当罕见的可靠性/可维护性影响支付可写性成本。“最佳”权衡将决定你的项目和你的优先顺序。 |
20
10
我同意这里的其他观点,但是我想解决关于可读性的问题——您可以通过在文件、函数或类声明的顶部使用typedef来避免所有这些问题。 我通常在类声明中使用它,因为类中的方法倾向于处理类似的数据类型(成员),typedef是分配在类上下文中有意义的名称的机会。这实际上有助于类方法定义的可读性。
在实施过程中:
与以下相反:
或:
|
21
9
使用名称空间std的一个示例由于计数的模糊性而引发编译错误,这也是算法库中的一个函数。
|
22
8
我认为在任何情况下都不一定是不好的做法,但使用时要小心。如果您正在编写一个库,那么您可能应该使用带有名称空间的范围解析操作符来防止您的库与其他库发生冲突。对于应用程序级代码,我看不出它有什么问题。 |
23
7
它不会使您的软件或项目性能变差,在源代码开头包含名称空间也不错。包括
这个
有人说把
|
24
6
“为什么使用命名空间STD?”被认为是C++中的一个坏习惯吗? 我换一种说法:为什么有些人认为输入5个额外的字符很麻烦? 例如,编写一个数字软件,当“vector”是问题域最重要的概念之一时,为什么还要考虑通过将一般的“std::vector”缩减为“vector”来污染全局命名空间? |
25
6
这取决于它的位置。如果它是一个公共头,那么您将通过将其合并到全局名称空间来减小名称空间的值。记住,这可能是一种使模块全局化的好方法。 |
26
6
这是一种不好的做法,通常被称为全球名称空间污染。当多个命名空间具有相同的带签名的函数名时,可能会出现问题,那么编译器将不明确地决定要调用哪个命名空间,当您使用类似的函数调用指定命名空间时,可以避免所有这些问题。
|
27
6
我同意其他人的看法,这是在要求名字冲突,模棱两可,然后事实是它不太明确。当我看到
如果您想找到一个可能是一个相当常见的名称的函数名,但只想在
我个人并不介意
还有另外一件事,尽管它与上述以及其他人指出的有些关系。虽然这可能是不好的练习,但我有时会保留
除此之外,还可以有名称空间别名。下面是一个例子,说明它在哪些地方有用,而这些地方可能没有被提及。我使用C++ 11标准,特别是用LIbSTDC++ ++。嗯,它还没有完成
我不会争论这是不是个坏主意。不过,我会争辩说,它可以让我的项目保持干净,同时也使它具体化:确实,我必须使用boost,但我使用它就像libstdc++最终会使用它一样。是的,开始你自己的项目,从一开始就以一个标准(…)开始,在帮助维护、开发和与项目相关的一切方面有很长的路要走!
编辑:
至于让Boost的regex成为
|
28
5
对于不合格的导入标识符,您需要外部搜索工具,如 格雷普 找出标识符的声明位置。这使得程序正确性的推理变得更加困难。 |
29
5
为了回答你的问题,我实际上是这样看的:很多程序员(不是所有人)都调用名称空间std。因此,人们应该养成不使用与名称空间std中名称相同的东西的习惯。这是非常理所当然的,但与可能的连贯词和假名的数量相比,这是不太可能的。这可以严格地说出来。 我是说真的…说“不要依赖这个存在”,就是让你相信它不存在。您经常会遇到借用代码片段并不断修复它们的问题。只要保持你的用户定义和借来的东西在有限的范围内,因为他们应该,并非常节省与全球(老实说,全球应该几乎总是最后的手段,目的是“编译现在,健全以后”)。我真的认为这是老师的坏建议,因为使用std对“cout”和“std::cout”都有效,但不使用std只对“std::cout”有效。您并不总是幸运地编写自己的代码。 注意:在您真正了解编译器的工作原理之前,不要过于关注效率问题。有了一点编码的经验,在你意识到好的代码能够概括为简单的东西之前,你不必对它们了解那么多。每一点都很简单,就好像你用C语言写了整件事一样。好的代码只是它需要的那么复杂而已。 |
30
5
根据我的经验,如果你有多个图书馆,比如,
例如,如果我输入,
|