在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