提问人:Luchian Grigore 提问时间:1/31/2013 最后编辑:Brian Tompsett - 汤莱恩Luchian Grigore 更新时间:11/30/2015 访问量:614
命名空间别名与定义 [已关闭] 的现实优势
Real-world advantage of namespace aliases vs defines [closed]
问:
就目前而言,这个问题并不适合我们的问答形式。我们希望答案得到事实、参考资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您认为此问题可以改进并可能重新打开,请访问帮助中心获取指导。
10年前关闭。
编辑:我计划重构一些代码,并用命名空间别名替换。我不能仅仅因为“宏是邪恶的”而这样做。我需要解释为什么我想做出改变,以及如果我不这样做会出什么问题。define
撇开“宏是邪恶的”的立场不谈,命名空间别名的缺点是什么?#define
获取代码
#define MY_NAMESPACE my_namespace
对
namespace MY_NAMESPACE = my_namespace;
使用别名的原因不在问题的范围之内。您还可以假设命名空间的名称足够唯一,以至于它不会出现在其他任何地方(即,它只是引用该命名空间,它不能 - 现在不行,将来不行 - 引用变量或类或其他任何东西),因此不会有歧义。
答:
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_ver1
XYZ_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_namespace
a::b
that_is_a_great_namespace
b
但是,如果您已经在使用并且它已经工作,那么在这种罕见的情况下重构代码可能没有用。#defines
评论
#define
#define