在C++中有创建一个匿名命名空间的方法,并且只能导出一个单独的函数吗?C++命名空间导出
我想是这样的:
namespace {
void Bar() {}
void Foo() { Bar(); }
}
现在,我想以某种方式获得Foo()
又确保有没有办法碰Bar()
谢谢!
在C++中有创建一个匿名命名空间的方法,并且只能导出一个单独的函数吗?C++命名空间导出
我想是这样的:
namespace {
void Bar() {}
void Foo() { Bar(); }
}
现在,我想以某种方式获得Foo()
又确保有没有办法碰Bar()
谢谢!
既然你想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()
+1良好的答案和模型的例子,它值得一些更多upvotes – sellibitze 2010-02-17 11:59:55
在包含Foo函数体的CPP文件中将Bar定义为全局静态函数。
编辑:值得注意的是,这只会导致链接时间错误。
Edit2:我跑了一个快速测试,似乎你不能外部匿名命名空间。 EDIT3:
像这样的事情似乎合理的(并且失去了命名空间)
static void Bar()
{
}
void Foo()
{
Bar();
}
现在可以 “外部无效美孚();”但如果您尝试与Bar相同,则连接器将失败,因为Bar不再具有外部链接。
在C++中不推荐使用此静态(请参阅当前标准或C++ 0x草案的7.3.1.1/2)。 – 2010-02-17 12:07:01
您可以将它们放在不同的头文件中,并确保客户端只获取声明Foo()
的头文件。但是,您无法实施与该解决方案内嵌的Foo()
。
为什么不
namespace {
void Bar() {};
};
void Foo() { Bar(); };
?
一个匿名的命名空间是您在
你是什么意思'导出函数'? – quamrana 2010-02-17 09:19:23
我理解这里的“导出”是在编译单元的上下文中“具有外部链接”。 – 2010-02-17 09:22:31