C++ (匿名)名稱空間、函數和頭文件
c++
C++ (匿名)名稱空間、函數和頭文件,c++,,,C++,,,不確定以前是否有人問過這個問題。我四處搜索,找不到我的情景的確切答案,但我可能錯過了問題:我在頭文件中有一個名稱空間,在頭文件中該名稱空間中有一些函數原型: Foo{void ();void (int);}在.cpp文件中,我想在名稱空間中定義函數,同時為它們所依賴的匿名名稱空間的隨機數生成器提供一些保護: Foo{{RNG rando =
不確定以前是否有人問過這個問題。我四處搜索訪問未命名文件時嘗試越過其結尾,找不到我的情景的確切答案,但我可能錯過了
問題:我在頭文件中有一個名稱空間,在頭文件中該名稱空間中有一些函數原型:
namespace Foo{
void SomeFunc();
void SomeOtherFunc(int);
}
在.cpp文件中,我想在名稱空間中定義函數,同時為它們所依賴的匿名名稱空間的隨機數生成器提供一些保護:
namespace Foo{
namespace{
RNG rando = new RNG();
}
void SomeFunc(){
//implementation
}
void SomeOtherFunc(){
//implementation
}
}
namespace{
RNG rando = new RNG();
}
void Foo::SomeFunc(){
//implementation
}
void Foo::SomeOtherFunc(int){
//implementation
}
我遇到的問題是,無法保證頭文件中的原型與我在cpp文件中定義的函數匹配。命名空間{}代碼塊中的所有內容都可以是新添加到命名空間中的內容
在上面的代碼示例中,()是在沒有int類型參數的情況下實現的,但其聲明表示它需要一些參數。實際上,似乎我重載了()簽名
我可以在cpp文件中使用以下內容:
namespace Foo{
namespace{
RNG rando = new RNG();
}
}
void Foo::SomeFunc(){
//implementation

}
void Foo::SomeOtherFunc(int){
//implementation
}
編譯器似乎加強了函數聲明和實現之間的關系,這是我喜歡的。但是這些函數似乎無法訪問匿名名稱空間中的數據
我是不是遺漏了什么?我能做些什么來解決我覺得在這個實現中存在的問題嗎?我不太熟悉使用(匿名)名稱空間,因此如果這看起來很基本,我很抱歉。
將未命名的名稱空間移出其他名稱空間:
namespace Foo{
namespace{
RNG rando = new RNG();
}
void SomeFunc(){
//implementation
}
void SomeOtherFunc(){
//implementation
}
}
namespace{
RNG rando = new RNG();
}
void Foo::SomeFunc(){
//implementation
}
void Foo::SomeOtherFunc(int){
//implementation
}
無論如何都不能在翻譯單元之外訪問它。
將未命名的命名空間移出其他命名空間:
namespace Foo{
namespace{
RNG rando = new RNG();
}
void SomeFunc(){
//implementation
}

void SomeOtherFunc(){
//implementation
}
}
namespace{
RNG rando = new RNG();
}
void Foo::SomeFunc(){
//implementation
}
void Foo::SomeOtherFunc(int){
//implementation
}
無論如何,在翻譯單元之外都無法訪問它。
匿名名稱空間是一種轉移注意力的方法。您可以忽略它,它實際上是一個實現細節
是的,您可以從.cpp文件的頭中重載函數。但是,如果您試圖使用該對中未定義的那一半,則會出現鏈接器錯誤。
匿名名稱空間是個麻煩。您可以忽略它,它實際上是一個實現細節
是的,您可以從.cpp文件的頭中重載函數。但是,如果您試圖使用該對中未定義的那一半,則會出現鏈接器錯誤。
據我所知,通常的約定是在.cpp文件的開頭聲明匿名名稱空間。在您的情況下,您的cpp文件應該如下所示
namespace{

RNG rando = new RNG();
}
void Foo::SomeFunc(){
//implementation
}
void Foo::SomeOtherFunc(int){
//implementation
}
通過這種方式,函數應該可以訪問rando。
據我所知,通常的約定是在.cpp文件的開頭聲明匿名名稱空間。在您的情況下,您的cpp文件應該如下所示
namespace{
RNG rando = new RNG();
}
void Foo::SomeFunc(){
//implementation
}
void Foo::SomeOtherFunc(int){
//implementation
}
通過這種方式,這些函數應該可以訪問rando。
太棒了,感謝您的快速響應。我想就是這樣,但昨晚我分心了訪問未命名文件時嘗試越過其結尾,沒有機會檢查。所以我想我會在工作的午休時間問你。太棒了,謝謝你的快速回復。我想就是這樣,但昨晚我分心了,沒有機會檢查。所以我想在我工作的午餐休息時間,我會在這里問一下。