2012-07-20 117 views
0

在我目前的工作中,我看到在cpp文件中的未命名命名空間中聲明的變量,並且只會被該類使用,就好像它們是成員變量一樣。在未命名的命名空間中聲明變量

我把它看作是一種有趣的方法,它只保存.h中的接口信息和.cpp中的接口信息,並且比通常的pimpl習慣用法的工作更少。

我看到人們一直在使用pimpl,但從來沒有這種方法,是否有任何問題呢?

+4

'皮條客'成語是'錢==權力'之一嗎? – Aesthete 2012-07-20 08:43:37

+0

在舊的C中,你不得不標記全局變量和函數'static'來使它們保持本地文件而不被導出。在C++中,您可以使用匿名命名空間來獲得相同的效果。 – 2012-07-20 08:45:40

+1

你能舉一個你的意思嗎?您不能在名稱空間範圍聲明成員,只能在類中聲明它們。如果它們是在命名空間範圍(未命名)聲明的,那麼它們不是成員。 – 2012-07-20 08:45:55

回答

0

在.cpp文件的未命名名稱空間中聲明的變量是文件作用域;這意味着每次執行程序只有一個實例。

您可以通過創建對象的兩個實例並觀察它們干擾未命名名稱空間中的對方變量來親自看到這一點。

+0

只有在.cpp文件的未命名名稱空間中聲明的'static'變量是文件作用域。否則,他們可能會有外部鏈接,並可以從其他文件訪問 – Andrew 2012-07-20 09:11:20

+0

對於像沒有做額外工作一樣的pimpl,這麼多。 – Lap 2012-07-20 09:19:51

+0

@匿名命名空間中的@ande非'static'變量可能具有外部鏈接,但無法從其他翻譯單元訪問它們:請參閱http://stackoverflow.com/questions/4181059/linkage-of-symbols-within -an-namespace-within-a-regular-namespace – ecatmur 2012-07-20 09:26:37

0

請顯示一些示例代碼。 AFAIK,你不能在未命名的命名空間中聲明成員變量(除非這個類本身是在未命名的命名空間中聲明的)。

引入了未命名的名稱空間,以取代常用的將變量聲明爲靜態的做法,僅在一個編譯單元中使用。

+0

我的不好,那些變量不再是成員變量,而是隻用於那個類,就好像它們是成員變量一樣。 – Lap 2012-07-20 09:16:47

+0

它們不能用作成員變量,因爲每個類只有一個實例。但是,它們可以像使用靜態成員變量一樣使用 – 2012-07-20 09:34:15