命名空间别名与定义 [已关闭] 的现实优势

Real-world advantage of namespace aliases vs defines [closed]

提问人:Luchian Grigore 提问时间:1/31/2013 最后编辑:Brian Tompsett - 汤莱恩Luchian Grigore 更新时间:11/30/2015 访问量:614

问:

编辑:我计划重构一些代码,并用命名空间别名替换。我不能仅仅因为“宏是邪恶的”而这样做。我需要解释为什么我想做出改变,以及如果我不这样做会出什么问题。define

撇开“宏是邪恶的”的立场不谈,命名空间别名的缺点是什么?#define

获取代码

#define MY_NAMESPACE my_namespace

namespace MY_NAMESPACE = my_namespace;

使用别名的原因不在问题的范围之内。您还可以假设命名空间的名称足够唯一,以至于它不会出现在其他任何地方(即,它只是引用该命名空间,它不能 - 现在不行,将来不行 - 引用变量或类或其他任何东西),因此不会有歧义。

C++ 命名空间 编码样式 C 预处理器

评论

11赞 Kerrek SB 1/31/2013
宏是邪恶的。
4赞 Caesar 1/31/2013
在相互竞争的假设中,应该选择最简单的假设。
8赞 Mike Seymour 1/31/2013
“You can also assume...”:使用适当作用域的语言级标识符,而不是让预处理器在不考虑作用域的情况下在代码中呕吐,您不需要做出任何此类假设。
6赞 David Rodríguez - dribeas 1/31/2013
@LuchianGrigore:不,完全一样。在任何其他情况下,如果有人可能会考虑,他们可以做出相同的假设,但这并不能保证从现在起两个月后,您不会开始使用某个标题中具有相同单词的库,或者有人可能会添加同名的变量......问题和答案是完全一样的,'s 是一把锤子,可以驱动钉子和螺丝(并在此过程中粉碎任何其他东西),命名空间别名是仅适用于螺丝的螺丝刀。#define#define
5赞 Component 10 1/31/2013
我把这个问题理解为“我怎样才能说服某人在时间和金钱方面赞助我,用一个更好的解决方案来替换代码(可能已经在工作),他们可能看不到其重要性,可能不会带来直接的切实利益,甚至可能 - 因为每次代码更改都涉及风险 - 在短期内增加问题的风险? - 如果是沿着这些思路,那么我认为这是一个建设性的问题。我每天都面临这些问题。

答:

5赞 James Kanze 1/31/2013 #1

在这种特殊情况下,这取决于。如果使用命名空间别名 诀窍,无论如何都更喜欢它而不是宏,因为所有的 通常的原因。但两者做的事情截然不同。你 无法使用其别名打开命名空间,即:

namespace XYZ_ver1 {}
namespace XYZ = XYZ_ver1;

namespace XYZ {     //  Illegal!
}

这适用于宏;事实上,您可以定义宏 在命名空间出现之前。如果你需要这个,那么 您需要使用宏。

评论

0赞 Luchian Grigore 1/31/2013
非常好!我从来没有想过这个。
0赞 Luchian Grigore 2/1/2013
我选择将此视为使用别名的优势 - 您可以限制扩展命名空间(除非您使用原始名称)
0赞 James Kanze 2/1/2013
@LuchianGrigore同意了。我在库代码本身中定义了一个宏,这样我就不必更改每个 in ,但我在客户端界面中提供了别名,因此客户端无法(意外或其他方式)添加到其中。(但我的观点是,至少在一定程度上,他提议的改变并不是无聊的。XYZ_ver1XYZ_ver2
2赞 Morwenn 1/31/2013 #2

一般来说,我看到命名空间别名的唯一优点是它们可以位于任何地方。以以下示例为例:

namespace a
{
    namespace that_is_a_great_namespace
    {
        namespace b = that_is_a_great_namespace;
    }
}

namespace that_is_a_great_namespace {}

您将无法定义将转换为没有副作用的宏。在这里,也将转换为 .在这些情况下,命名空间别名有助于解决名称冲突。a::that_is_a_great_namespacea::bthat_is_a_great_namespaceb

但是,如果您已经在使用并且它已经工作,那么在这种罕见的情况下重构代码可能没有用。#defines