c++ - 使用宏替换 "using namespace ...;"

标签 c++ macros namespaces

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

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

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

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

#define USING_LIB_A_NS using namespace lib::a

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

最佳答案

另一个建议:

namespace la=lib::a;

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

代表您键入的数量和仍然使用命名空间限定的安全性之间的良好折衷(从而避免命名冲突)。

例如很容易忘记 std 定义了 leftright,而且这些名字非常诱人,特别是用于成员/函数如果您正在编写二叉树(这就是为什么 using namespace std; 如此令人不悦)。

鉴于您正在构建一个库,随着复杂性的增加,“通用领域特定术语”将有可能与您自己的术语发生冲突 - 否则为什么需要区分 lib::alib::b

关于c++ - 使用宏替换 "using namespace ...;",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39432320/

相关文章:

c - 理解递归宏扩展

Swift 命名空间问题

php:使用带有类别名的扩展

c++ - 可以将 "using std::swap;"放在 header 中吗?

c++ - 如何在 Visual C++ 2010 Express 中更改编译器

c++ - .IsA 在 Python 中的含义

c++ - 体系结构 x86_64 jsonrpc 库的 undefined symbol

c - 在 #define 中使用 ({...}) 与 do {...} while(0); ?

testing - 如何测试使用 gensyms 的 clojure 宏?

c++ - 可以创建 N 个方法的类接口(interface)