2015-02-07 88 views
1

我已經有了一些嵌入式C++代碼,這些代碼目前以非常類似C的方式編寫,並且我想將其轉換爲使用命名空間以實現更好的代碼組織。目前我隱藏我的私人文件範圍功能和變量在匿名命名空間,但我不知道在哪裏隱藏它使用這種新的模式。我仍然應該使用匿名命名空間,還是將它添加到.cpp文件中的命名空間,而不是足夠的頭文件以防止外部訪問?使用C++命名空間的文件範圍數據

更具體地說,我有代碼看起來像這樣:

UI.h

#ifndef UI_H 
#define UI_H 

//Public data declarations 
extern int g_UiPublicVar; 

//Public function declarations 
void UI_PublicFunc(); 

#endif 

UI.cpp

#include "UI.h" 

//Private data and functions 
namespace 
{ 
int m_PrivateVar = 10; 

void privateFunc() 
{ 
    //Do stuff! 
} 
} 

//Public data definitions 
int g_UiPublicVar = 10; 

//Public function definitions 
void UI_PublicFunc() 
{ 
    m_PrivateVar++; 
    privateFunc(); 
} 

...我我想重組它看起來像這樣:

新UI.h

#ifndef UI_H 
#define UI_H 

namespace UI 
{ 

//Public data declarations 
extern int publicVar; 

//Public function declarations 
void publicFunc(); 

} 

#endif 

新UI.cpp

#include "UI.h" 

namespace UI 
{ 

//Public data definitions 
int publicVar = 10; 

//Public function definitions 
void publicFunc() 
{ 
    m_PrivateVar++; 
    privateFunc(); 
} 

} 

...我應該在哪裏把m_PrivateVar和privateFunc()?

+1

在嵌套的匿名命名空間中? – Christophe 2015-02-07 17:08:42

回答

1

解決的辦法是把它放在一個匿名的嵌套命名空間爲私有元素:

文件UI.cpp:

namespace UI 
{ 
    namespace // nested private namespace 
    { 
     int m_PrivateVar = 10; 
     void privateFunc() 
     { 
      //Do stuff! 
     } 
    } 
    //Public definitions 
    ... 
} 

其他編譯單元則無法看到它,匿名名稱空間對於每個編譯單元都是唯一的。

您可以測試使用第三編譯單元,包括UI.h並試圖創建訪問私有函數此設置:

文件main.cpp中:

#include "UI.h" 
namespace UI { 
    extern void privateFunc(); // Hijack temptative 
} 
int main(int ac, char**av) 
{ 
    UI::publicFunc(); // yes !! 
    UI::privateFunc(); // compiles, but generates a linking error 
         // private remains private :-) !!! 
} 

即使hijack temptative也會使用匿名命名空間,它不起作用,仍然會導致鏈接錯誤,因爲如前所述,匿名命名空間對於每個編譯單元都是唯一的。