使用C++;名称空间 我有一些嵌入式C++代码,目前用非常类似C的方式编写,我想把它转换成使用更好的代码组织的命名空间。目前,我将私有文件作用域函数和变量隐藏在匿名名称空间中,但我不确定使用这种新模式将其隐藏在何处。我应该仍然使用匿名名称空间,还是将其添加到.cpp文件中的名称空间,但头文件不足以阻止外部访问
更具体地说,我有如下代码: UI.h使用C++;名称空间 我有一些嵌入式C++代码,目前用非常类似C的方式编写,我想把它转换成使用更好的代码组织的命名空间。目前,我将私有文件作用域函数和变量隐藏在匿名名称空间中,但我不确定使用这种新模式将其隐藏在何处。我应该仍然使用匿名名称空间,还是将其添加到.cpp文件中的名称空间,但头文件不足以阻止外部访问,c++,namespaces,linkage,C++,Namespaces,Linkage,更具体地说,我有如下代码: UI.h #ifndef UI_H #define UI_H //Public data declarations extern int g_UiPublicVar; //Public function declarations void UI_PublicFunc(); #endif #ifndef UI_H #define UI_H namespace UI { //Public data declarations extern int publicV
#ifndef UI_H
#define UI_H
//Public data declarations
extern int g_UiPublicVar;
//Public function declarations
void UI_PublicFunc();
#endif
#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"
//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();
}
#include "UI.h"
namespace UI
{
//Public data definitions
int publicVar = 10;
//Public function definitions
void publicFunc()
{
m_PrivateVar++;
privateFunc();
}
}
…我想把它重组成这样:
新的UI.h
#ifndef UI_H
#define UI_H
//Public data declarations
extern int g_UiPublicVar;
//Public function declarations
void UI_PublicFunc();
#endif
#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"
//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();
}
#include "UI.h"
namespace UI
{
//Public data definitions
int publicVar = 10;
//Public function definitions
void publicFunc()
{
m_PrivateVar++;
privateFunc();
}
}
…我应该将m_PrivateVar和privateFunc()放在哪里?解决方案是将其放在私有元素的匿名嵌套命名空间中: 文件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 :-) !!!
}
即使劫持诱因也会使用匿名名称空间,它也不会工作,并且仍然会导致链接错误,因为正如前面所说的,匿名名称空间对于每个编译单元都是唯一的 在嵌套的匿名命名空间中?