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

Luc*_*ore 2 c++ macros coding-style namespaces c-preprocessor

编辑:我正在计划重构一些代码,并用define命名空间别名替换.我不能这样做只是因为"宏是邪恶的".我需要解释为什么我要做出改变,如果不这样做,可能会出现什么问题.

撇开"宏是邪恶的"立场,#define超过命名空间别名的垮台是什么?

拿代码

#define MY_NAMESPACE my_namespace
Run Code Online (Sandbox Code Playgroud)

namespace MY_NAMESPACE = my_namespace;
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*nze 5

在这种特殊情况下,它取决于.如果使用命名空间别名可以解决这个问题,无论如何都要将它放在宏中,这是出于所有常见原因.但两者做的完全不同.您无法使用其别名打开命名空间,即:

namespace XYZ_ver1 {}
namespace XYZ = XYZ_ver1;

namespace XYZ {     //  Illegal!
}
Run Code Online (Sandbox Code Playgroud)

这适用于宏; 实际上,您可以在命名空间出现之前定义宏.如果需要,则需要使用宏.