2013-02-19 35 views
0

namespace alias#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; 
+2

至少总是不使用宏的一般优点,您可以在这里找到几十个或几百个问题:宏不知道命名空间,范​​围等 – PlasmaHH 2013-02-19 11:34:03

+0

您是否了解两者之间的区别? – 2013-02-19 11:35:03

回答

2

名称空间别名比#define有什么好处?

定义的一般缺点在这里也适用:所述预处理器取代编译之前的源,这导致了许多(更大或更小)的问题:

  • 试图在使用NS::fun调试器将导致调试器告诉你没有NS名称空间(因为编译器从未真正看到该符号)。

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

此外,#define -d符号不属于namspaces。这意味着一旦你#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 
} 

如果客户端代码是你自己,这不是一个问题,因为你可以简单地避免名称(虽然没有借口,你为什么要到)。

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

3

使用别名时,编译器会知道NS符号,而使用宏时,只要能够找到它就会替换该字符串。所以如果你碰巧有一个名为NS的局部变量,它将用NS1 :: NS2 :: NS3代替它,这几乎不是你想要的。

2

要什么daramarak说扩大,命名空间别名会尊重语法语义; #define不会。命名空间别名只会在编译器遇到像NS::func()之类的东西时起作用,另一方面#define是完全钝的工具,并且还会识别和破坏类似NS()int NS=7或甚至namespace NS=NS1::NS2::NS3的语句。而且,相信我,当它破坏它时,你会得到完全混淆的错误信息。