2016-08-05 64 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