define
。我不能这样做只是因为“宏是邪恶的”。我需要解释为什么我想要进行更改,而 可能会出错,如果我不这样做的话。
除了“宏是邪恶的”这一立场之外,#define
对名称空间别名的垮台是什么?
拿代码
#define MY_NAMESPACE my_namespace
与
namespace MY_NAMESPACE = my_namespace;
拥有别名的原因不在问题的范围内。您还可以假设命名空间的名称足够独特,以至于它不会出现在其他地方(即它只是引用该命名空间,它不能 - 现在不是,不会在将来 - 引用变量或类或无论如何),那里就没有歧义了。
答案 0 :(得分:5)
在这种特殊情况下,它取决于。如果使用命名空间别名 诀窍,无论如何都喜欢它的宏,所有的 通常的原因。但两者做的完全不同。您 无法使用别名打开命名空间,即:
namespace XYZ_ver1 {}
namespace XYZ = XYZ_ver1;
namespace XYZ { // Illegal!
}
这适用于宏;实际上,您可以定义宏 在命名空间出现之前。如果你需要这个,那么 你需要使用一个宏。
答案 1 :(得分: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
并且它已经有效,那么为这种罕见情况重构您的代码可能没有用。