具有 C++ 命名空间的文件范围数据
File scope data with C++ namespaces
我有一些嵌入式 C++ 代码,目前以非常类似于 C 的方式编写,我想将其转换为使用名称空间以更好地组织代码。目前我在匿名命名空间中隐藏我的私有文件范围函数和变量,但我不确定使用这个新模式将它隐藏在哪里。我是否仍应使用匿名命名空间,还是将其添加到 .cpp 文件中的命名空间,但头文件不足以阻止外部访问?
更具体地说,我有这样的代码:
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() 放在哪里?
解决方案是将其放在私有元素的匿名嵌套命名空间中:
文件 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 :-) !!!
}
即使劫持者也使用匿名命名空间,它也不会起作用并且仍然会导致链接错误,因为如前所述,匿名命名空间对于每个编译单元都是唯一的。
我有一些嵌入式 C++ 代码,目前以非常类似于 C 的方式编写,我想将其转换为使用名称空间以更好地组织代码。目前我在匿名命名空间中隐藏我的私有文件范围函数和变量,但我不确定使用这个新模式将它隐藏在哪里。我是否仍应使用匿名命名空间,还是将其添加到 .cpp 文件中的命名空间,但头文件不足以阻止外部访问?
更具体地说,我有这样的代码:
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() 放在哪里?
解决方案是将其放在私有元素的匿名嵌套命名空间中:
文件 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 :-) !!!
}
即使劫持者也使用匿名命名空间,它也不会起作用并且仍然会导致链接错误,因为如前所述,匿名命名空间对于每个编译单元都是唯一的。