【问题标题】:File scope data with C++ namespaces具有 C++ 命名空间的文件范围数据
【发布时间】:2015-04-07 17:22:17
【问题描述】:

我有一些嵌入式 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() 放在哪里?

【问题讨论】:

  • 在嵌套的匿名命名空间中?

标签: c++ namespaces linkage


【解决方案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 :-)  !!!
}

即使劫持诱惑也使用匿名命名空间,它也不起作用并且仍然导致链接错误,因为如前所述,匿名命名空间对于每个编译单元都是唯一的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多