2010-02-17 266 views
0

在C++中有创建一个匿名命名空间的方法,并且只能导出一个单独的函数吗?C++命名空间导出

我想是这样的:

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

现在,我想以某种方式获得Foo()又确保有没有办法碰Bar()

谢谢!

+0

你是什么意思'导出函数'? – quamrana 2010-02-17 09:19:23

+0

我理解这里的“导出”是在编译单元的上下文中“具有外部链接”。 – 2010-02-17 09:22:31

回答

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()

+0

+1良好的答案和模型的例子,它值得一些更多upvotes – sellibitze 2010-02-17 11:59:55

0

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

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

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

static void Bar() 
{ 
} 

void Foo() 
{ 
    Bar(); 
} 

现在可以 “外部无效美孚();”但如果您尝试与Bar相同,则连接器将失败,因为Bar不再具有外部链接。

+0

在C++中不推荐使用此静态(请参阅当前标准或C++ 0x草案的7.3.1.1/2)。 – 2010-02-17 12:07:01

2

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

7

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

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

匿名命名空间是为了不离开cpp(obj)文件。所以出口和匿名是硬币的不同侧面。 – Totonga 2010-02-17 09:20:56

+0

这并不限制'Bar()' – quamrana 2010-02-17 09:32:41

+2

的访问它限制从其他编译单元访问Bar()。 – 2010-02-17 09:42:51

1

为什么不

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

一个匿名的命名空间是您在