2011-10-05 68 views
2

我有一个大型的软件框架,目前生活在一个通用的命名空间。最近,我将一些类移入嵌套的名称空间,但为了暂时保持向后兼容性,我需要将名称保留在全局名称空间中。到目前为止,我使用using从嵌套命名空间注入类型:Typedef或使用?

namespace framework { 
    namespace IO { 
    struct IStream; 
    } 
#if COMPATIBILITY 
using IO::IStream; 
#endif 
} 

但是,我同样可以使用typedef IO::IStream IStream;。使用typedef而不是using有什么优势/劣势?

+0

但要小心AD''used'_函数重载;使用非类型可能不完全按照你的想法(http://stackoverflow.com/questions/2953684/why-doesnt-adl-find-function-templates) – sehe

+0

可能的重复[有什么区别typedef和使用?](http://stackoverflow.com/questions/7657710/what-are-the-differences-between-typedef-and-using) –

回答

4

它们有些不同:typedef引入了一个新类型名称framework::IStream,而using指令只影响它所在范围内的名称查找。 (这有额外的效果,如果你要定义一个独立的,真正的类型framework::IStream,但因为你不这样做,这不是一个问题。)

在这个意义上我会说,using是一个实现细节,它比通过引入新类型名称而产生的全局语义变化更可取。因此,如果您可以避开它,请在需要的范围内使用using指令,然后逐渐将这些指令迁移到新系统。

+0

'typedef'不会创建新的类型。它会创建别名,并且编译器在typedef中键入的“源”和“目标”之间没有任何区别。 – n0rd

+2

@ n0rd:我将它改为“type name”。 –

相关问题