2016-08-05 33 views
1

我对使用声明有点困惑。据我所知,using foo::bar;从命名空间foo将符号bar导入当前名称空间,但是这是静态还是动态发生的?正在使用 - 声明静态?

更具体地说,使用声明会导致开销吗?根据条件是否可以导入具有相同名称的不同符号? (这将是不好的做法,但我很好奇都一样)

感觉像它应该是静态的,但我找不到任何证实这一点...

+5

“符号导入”仅为概念性的;在实践中,名称空间foo上的'using'声明只告诉编译器,非名称空间限定的符号可能指代来自'foo'的符号。由于符号(大部分)在运行时不存在,所以不会有运行时间开销。编译器的开销是否依赖于编译器。 – KABoissonneault

+0

谢谢。这实际上比下面的答案更有帮助。 – Eternal

回答

8

命名空间解析发生在编译时。您无法在运行时动态更改它们。

一种方式导入视病情不同的符号是使用预处理器指令和宏:

#ifdef USEA 
using a::f; 
#else 
using b::f; 
#endif 
0

使用声明看起来像任何其他声明。它有自己的范围取决于它在哪里写。你不能动态地声明一个变量。

+4

我不认为OP在“文件范围”中正在讨论'static'。我认为这更多的是关于静态与动态(即:编译时与运行时间) – KABoissonneault

+0

@KABoissonneault你为什么决定我在谈论静态存储时间? –

+4

我只是不认为范围的概念与这个答案有关。作为一个证明,它让我对你的回答暗示的内容感到困惑。 – KABoissonneault

2

usingc++编译时指令,即它不仅影响编译器编译

期间如何解析名称

根据条件是否可以导入具有相同名称的不同符号?

取决于您所谈论的条件。在预处理器的情况下,如#ifdef是的,这是可能的。如果您考虑运行时间条件,则不会在运行时执行using