具有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 :-) !!!
}
即使劫持临时性也会使用匿名命名空间,它也不会起作用,仍然会导致链接错误,因为正如前面所说,匿名命名空间对于每个编译单元都是唯一的。
相关文章:
- 如何计算数据类型的范围,例如int
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 即使在超出范围之后,我是否可以保留矢量数据
- C++ 中的类之间的数据重新循环 - 错误:'<class name>'未在此范围内声明
- C++数据类型 s 及其范围
- C++,"由于数据类型范围有限,比较总是正确的"
- C++中最大的数据类型范围
- pImpl、范围和隐藏数据成员
- 在 c++ 中确定某个值是否在该数据类型的最大范围内
- 向量下标出的范围错误.即使向量的索引大于访问数据的索引,也会发生误差
- 在基于范围的循环范围内的双/整数使用和数据缩小
- C++奇怪的问题.数据成员超出范围
- 范围视图作为数据成员
- 当数字可能超出C++中特定数据类型的范围时如何处理异常?
- 错误:非静态数据成员的使用无效,在此范围内未声明变量
- OpenCV-浮动数据类型和强度范围在0-255范围内的RGB通道
- 运算符重载中变量的数据类型和范围应该是什么
- 如何根据过滤的数据创建笛卡尔产品范围
- 编写一个程序,该程序在0-99范围内生成10000个随机整数,并从随机数据中产生直方图
- 具有C++命名空间的文件范围数据