具有C++命名空间的文件范围数据

File scope data with C++ namespaces

本文关键字:范围 数据 文件 C++ 命名空间 具有      更新时间:2023-10-16

我有一些嵌入式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 :-)  !!!
}

即使劫持临时性也会使用匿名命名空间,它也不会起作用,仍然会导致链接错误,因为正如前面所说,匿名命名空间对于每个编译单元都是唯一的。