命名空间的可见性问题

时间:2010-07-06 13:24:26

标签: c++ namespaces visibility

我有两个源文件,一个名为main.cpp(其中定义了名称空间M)和文件engines.h(其中定义了多个名称)。
main.cpp包括engines.h engines.h需要使用M中的内容,M需要使用engines.h内的内容。

我在using namespace M;中执行engines.h时收到错误。

2 个答案:

答案 0 :(得分:3)

不要在头文件中使用namespace。这将从包含该头文件的每个翻译单元内的命名空间中获取所有符号,因此您将有一个符号混乱(名称冲突,这可能是您在您的情况下所面临的)。在头文件中使用完全限定,或者至少在本地使用using namespace语句(在一个函数或方法中,在那里提高可读性)。

根据您的情况,您得到的错误是什么?标题的内容是什么?

答案 1 :(得分:2)

在定义命名空间之前,您无法执行using namespace M。如果存在循环依赖关系,则需要使用一种或多种技术来解决它

  • 如果您的使用不需要知道类的成员或大小,只需处理指针或对它们的引用,则转发声明:

    namespace M { class MyCow; }
    
  • 在engines.cc中定义东西

    // engines.h
    void f();
    
    // engines.cpp
    #include "main.h"
    void f() { MyCow muuh; }
    
  • 使用pimpl idiom可以进一步减少依赖关系,因为它可以使标头不受仅由实现使用的标头的影响..

将.h文件中的部分拆分为接口和.cpp文件,以便实现处理此类依赖项。这样,标头较少依赖于其他标头,并且实现文件可以包括标头。