2010-02-17 128 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(); }; 

一個匿名的命名空間是您在