c ++名称空间导出

时间:2010-02-17 09:14:10

标签: c++ export namespaces

C ++中有没有办法创建一个匿名命名空间,只能从中导出一个函数?

我想要类似的东西:

namespace {
  void Bar() {}
  void Foo() { Bar(); }
}

现在,我想以某种方式访问​​Foo(),但要确保无法触及Bar()

谢谢!

5 个答案:

答案 0 :(得分:7)

如果要导出该函数,则必须将其放在匿名命名空间之外。

namespace {
  void Bar() {};
};
void Foo() { Bar(); };

答案 1 :(得分:3)

由于您希望Foo()具有外部链接,因此您应该在头文件中声明它:

#ifndef FOO_H
#define FOO_H

void Foo();

#endif

现在每个人都可以看到并致电Foo()

但是在Foo.cpp:

#include "Foo.h"

namespace {
    void Bar(){ }
}

void Foo(){ Bar(); }

现在,只要您控制源文件Foo.cpp,就没有人可以更改对Bar()

的访问权限

答案 2 :(得分:2)

您可以将它们放在不同的头文件中,并确保客户端只获取声明Foo()的头文件。但是,您无法实施Foo()内联解决方案。

答案 3 :(得分:1)

为什么不

namespace {
  void Bar() {};
};
void Foo() { Bar(); };

可以从您在

中创建的文件中访问匿名命名空间

答案 4 :(得分:0)

将Bar定义为CPP文件中的全局静态函数,该文件包含Foo的函数体。

编辑:值得注意的是,这只会导致链接时间错误 编辑2:我跑了一个快速测试,似乎你不能extern到匿名命名空间。 EDIT3:

这样的事情似乎合情合理(并失去命名空间)

static void Bar()
{
}

void Foo()
{
    Bar();
}

你现在可以“extern void Foo();”但是如果你尝试使用Bar,那么链接器将会失败,因为Bar不再具有外部链接。