C ++中有没有办法创建一个匿名命名空间,只能从中导出一个函数?
我想要类似的东西:
namespace {
void Bar() {}
void Foo() { Bar(); }
}
现在,我想以某种方式访问Foo()
,但要确保无法触及Bar()
谢谢!
答案 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不再具有外部链接。