名称空间别名与定义的真实优势

时间:2013-01-31 14:55:54

标签: c++ namespaces macros coding-style c-preprocessor

编辑:我正在计划重构一些代码,并用命名空间别名替换define。我不能这样做只是因为“宏是邪恶的”。我需要解释为什么我想要进行更改,而 可能会出错,如果我不这样做的话。

除了“宏是邪恶的”这一立场之外,#define对名称空间别名的垮台是什么?

拿代码

#define MY_NAMESPACE my_namespace

namespace MY_NAMESPACE = my_namespace;

拥有别名的原因不在问题的范围内。您还可以假设命名空间的名称足够独特,以至于它不会出现在其他地方(即它只是引用该命名空间,它不能 - 现在不是,不会在将来 - 引用变量或类或无论如何),那里就没有歧义了。

2 个答案:

答案 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并且它已经有效,那么为这种罕见情况重构您的代码可能没有用。