0

namespace aliasover有什么好处#define

namespace NS1{
    namespace NS2 {
        namespace NS3
        {
            void fun() {
                std::cout << "Understanding namespace alias\n";
            }
        }
    }
}

#define NS NS1::NS2::NS3
//over
namespace NS=NS1::NS2::NS3;
4

3 回答 3

3

使用别名时,编译器会知道 NS 符号,而使用宏时,它会在找到字符串时替换字符串。因此,如果您碰巧有一个名为 NS 的局部变量,它将用 NS1::NS2::NS3 替换它,这几乎不是您想要的。

于 2013-02-19T11:35:16.083 回答
2

为了扩展 daramarak 所说的内容,命名空间别名将尊重语法语义#define不会。命名空间别名只会在编译器遇到类似NS::func()的东西时才会启动,#define另一方面是一个完全生硬的工具,也会识别和破坏像NS()or int NS=7or,even,这样的语句namespace NS=NS1::NS2::NS3。而且,相信我,当它确实破坏它时,你会得到完全混乱的错误消息。

于 2013-02-19T11:41:37.753 回答
2

命名空间别名相对于#define 有什么好处?

定义的一般缺点在这里适用:预处理器在编译之前替换源代码,这会导致一些(或大或小)问题:

  • 尝试NS::fun在调试器中使用会导致调试器告诉您没有 NS 命名空间(因为编译器从未真正看到该符号)。

  • 由命名空间内的实体引起的错误消息,将产生带有在源代码中根本找不到的标记的错误消息(无论您如何搜索),除非您知道(在您的客户端代码中)您没有查看命名空间,但是在一个看起来像命名空间的定义中。

此外,#define-d 符号不属于命名空间。这意味着一旦你#define NS,你将无法在你的源代码中的任何其他地方有一个 NS 符号(因为你的预编译器会在不说任何内容的情况下播放 switcheroo)。这意味着你不能说:

namespace client_code // namespace where NS should not be visible
{
    int NS = 0; // compiler tries to compile "int NS1::NS2::NS3 = 0;",
                // knowing that NS3 is a namespace
}

如果客户端代码是您自己的,那不是问题,因为您可以简单地避免使用该名称(尽管您没有理由必须这样做)。

如果您正在编写任何其他人将使用的头文件/库,至少您应该提供一个已知限制列表,您说“客户端代码不能使用这些和这些名称”。

于 2013-02-19T12:18:41.007 回答