2017-04-16 95 views
3

很抱歉,如果这是一个愚蠢的问题,但我学习C++(我一般用C代码),我不知道如何使用命名空间和类。他们必须在头文件中声明吗?我如何在名称空间中声明函数?假设我正在处理一个包含不同文件的大型项目。我定义在文件中的命名空间,但是再要更多的功能添加到同一个命名空间,但这些功能在另一个文件中定义。可以这样做吗?例如:如何使用命名空间和类?

file1.cpp

namespace Example { 
    int vartest; 
    void foo(); 
} 

file2.cpp

int othervar; 
void otherfoo(); // How can I add this and othervar to the Example namespace? 

谢谢!

+0

命名空间既然你来自C,你可能会发现匿名命名空间可以替代'static'。 'namespace {bool Ireturntrue(){return true; }}现在很好地被隔离开来,并且在链接时不会增加名称污染。 – user4581301

回答

4

只需声明它同样“名”的等效 namespace

file1.cpp

namespace Example { 
    int vartest; 
    void foo(); 
} 

file2.cpp

namespace Example { 
    int othervar; 
    void otherfoo(); 
} 

命名空间合并。

他们有在头文件中声明?

不可以。您可以在namespace内声明任何namespace。 (请注意,“全球范围”也是namespace

如何在命名空间中声明函数?

只需在namespace内声明。正如你所做的那样。

并且我们假设我正在处理一个包含不同文件的大型项目。 我定义在文件中的命名空间,但后来想更多 功能添加到同一个命名空间,但这些功能在 另一个文件中定义。可以这样做吗?

合并相同名称空间内同名的命名空间。

namespace X { void foo(){} } 
namespace X { void foo(){} } //Error, redefinition of `foo` because the namespace ::X is merged 

namespace X { void foo(){} } 
namespace Y { void foo(){} } //Ok. Different name spaces... 

namespace X { void foo(){} } // ::X 
namespace Y { void foo(){} } // ::Y 

namespace Y { 
    namespace X { // namespace ::Y::X here isn't same as ::X 
    void foo(){} //OK 
    } 
} 

召回了所谓的 “全球范围内”,实际上是被称为global namespace

+0

为全局命名空间上的最后一个注释加1。 – 0xDEFACED