2

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

抛开“宏是邪恶的”的立场不谈,#defineover a namespace alias 的缺点是什么?

拿代码

#define MY_NAMESPACE my_namespace

相对

namespace MY_NAMESPACE = my_namespace;

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

4

2 回答 2

5

在这种特殊情况下,这取决于。如果使用命名空间别名可以解决问题,那么出于所有通常的原因,无论如何都更喜欢它而不是宏。但两者做的事情完全不同。您不能使用其别名打开命名空间,即:

namespace XYZ_ver1 {}
namespace XYZ = XYZ_ver1;

namespace XYZ {     //  Illegal!
}

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

于 2013-01-31T15:46:48.250 回答
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::b没有副作用的宏。在这里,that_is_a_great_namespace也将转换为b. 在这些情况下,命名空间别名有助于解决名称冲突。

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

于 2013-01-31T15:50:47.600 回答