我对使用声明有点困惑。据我所知,using foo::bar;
从命名空间foo
将符号bar
导入当前名称空间,但是这是静态还是动态发生的?正在使用 - 声明静态?
更具体地说,使用声明会导致开销吗?根据条件是否可以导入具有相同名称的不同符号? (这将是不好的做法,但我很好奇都一样)
感觉像它应该是静态的,但我找不到任何证实这一点...
我对使用声明有点困惑。据我所知,using foo::bar;
从命名空间foo
将符号bar
导入当前名称空间,但是这是静态还是动态发生的?正在使用 - 声明静态?
更具体地说,使用声明会导致开销吗?根据条件是否可以导入具有相同名称的不同符号? (这将是不好的做法,但我很好奇都一样)
感觉像它应该是静态的,但我找不到任何证实这一点...
命名空间解析发生在编译时。您无法在运行时动态更改它们。
一种方式导入视病情不同的符号是使用预处理器指令和宏:
#ifdef USEA
using a::f;
#else
using b::f;
#endif
使用声明看起来像任何其他声明。它有自己的范围取决于它在哪里写。你不能动态地声明一个变量。
我不认为OP在“文件范围”中正在讨论'static'。我认为这更多的是关于静态与动态(即:编译时与运行时间) – KABoissonneault
@KABoissonneault你为什么决定我在谈论静态存储时间? –
我只是不认为范围的概念与这个答案有关。作为一个证明,它让我对你的回答暗示的内容感到困惑。 – KABoissonneault
using
在c++
是编译时指令,即它不仅影响编译器编译
根据条件是否可以导入具有相同名称的不同符号?
取决于您所谈论的条件。在预处理器的情况下,如#ifdef
是的,这是可能的。如果您考虑运行时间条件,则不会在运行时执行using
“符号导入”仅为概念性的;在实践中,名称空间foo上的'using'声明只告诉编译器,非名称空间限定的符号可能指代来自'foo'的符号。由于符号(大部分)在运行时不存在,所以不会有运行时间开销。编译器的开销是否依赖于编译器。 – KABoissonneault
谢谢。这实际上比下面的答案更有帮助。 – Eternal