使用宏来替换“using namespace ...;”

时间:2016-09-11 02:30:43

标签: c++ macros namespaces

我遇到的问题与C ++中的样式有关,这是我目前正在自己​​的库中讨论的问题。 请考虑以下示例:

在库约定下,库中的所有内容都包含在具有库名称的命名空间中。假设它是lib。现在,假设我们在该库中有一个模块,它有自己的命名空间和一系列类:

namespace lib
{
    namespace a
    {
        class X;
        class Y;
        class Z;
    }
 }

现在通常如果我想访问类X,我必须输入lib::a::X,但这会在一段时间后变得乏味。由于我尝试将命名空间保持为尽可能本地化,因此我通常将using namespace lib::a;放在我使用命名空间a成员的函数的顶部。我的问题是:说而不是必须键入using namespace lib::a;我在标题中定义了一个宏,如下所示:

#define USING_LIB_A_NS using namespace lib::a

然后我可以使用这个宏代替。使用它可能会产生任何潜在的问题吗?到目前为止我还没有找到,但我很想知道是否有任何潜在的问题。

4 个答案:

答案 0 :(得分:1)

另一个建议:

namespace la=lib::a;

la::X x; // short, sweet and safe

表示您键入的金额与仍使用命名空间限定的安全性之间的良好折衷(从而避免命名冲突)。

E.g。很容易忘记std定义leftright,这些是非常吸引人的名字,用于成员/功能,特别是如果你正在编码二叉树(这就是using namespace std;如此皱眉的原因。)

鉴于您正在构建一个库,随着复杂性的增加,“常见的域特定术语”将被提升。将为您创建与您自己的条款冲突的机会 - 否则为什么需要区分lib::alib::b

答案 1 :(得分:0)

我不建议使用

#define USING_LIB_A_NS using namespace lib::a

在您的代码中,使用

USING_LIB_A_NS;

与使用

完全不同
using namespace lib::a;

后者更清晰,更可取。

只有在简化了更多代码的创建时,才能在C ++中使用宏。

答案 2 :(得分:0)

好吧,如果你确定定义了marco然后使用它就像你输入“using namespace”一样。

当你去编译你的程序时,有一个预处理步骤,preprocessor只是文本替换,即用文本替换marco。

所以,如果您有像

这样的代码
#define PLUSFIVE(x) (x+5)

int main(int argv, char** argc){

    std::cout << PLUSFIVE(4) << std::endl;
}

在预处理步骤之后,它看起来像

int main(int argv, char** argc){

    std::cout << 4+5 << std::endl;
}

所以简而言之,没有区别。

答案 3 :(得分:0)

现代IDE为您提供自动填充和代码片段以及所有类型的小饰品,以减少繁琐的重复输入。现在,当你(或其他人)开始阅读代码时,丑陋的情绪发生了变化:花费很少时间进行输入可能需要花费很多时间来阅读和理解。因此,如果使用宏的唯一目标是减少键盘活动,我建议您在IDE中定义代码片段。

话虽如此,我认为这个宏没有破坏你的代码行为或类似的东西的实际危险 - 这只是一个风格问题。