编辑:我刨重构一些代码,并替换define
与命名空间别名。 我不能做到这一点,虽然仅仅是因为“宏是邪恶的”。 我需要解释为什么我要作出改变, 什么可以去错了,如果我不知道。
撇开立场,“宏是邪恶的”,什么是的挫折#define
了一个命名空间的别名?
就拿代码
#define MY_NAMESPACE my_namespace
与
namespace MY_NAMESPACE = my_namespace;
其原因有别名是不是在问题的范围。 您也可以承担命名空间的名称是足够独特之处在于它不会出现其他地方(即它只是引用该命名空间,它不能 - 不是现在,不是在未来 - 是指一个变量或一个类或等等),所以不能有任何含糊那里。
在这种特殊情况下,它依赖。 如果使用空间别名的伎俩,通过各种手段它喜欢宏,所有的通常的原因。 但是,这两个做完全不同的事情。 使用它的别名,即无法打开一个命名空间:
namespace XYZ_ver1 {}
namespace XYZ = XYZ_ver1;
namespace XYZ { // Illegal!
}
这适用于宏; 其实,你可以定义宏的名称空间曾经出现之前。 如果你需要这个,那么你需要使用宏。
一般来说,我与命名空间别名看到的唯一的好处是,他们可以在任何地方。 看看下面的例子:
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
,它已经工作,重构你的代码,这种罕见的情况下,可能没有用处。