C标头中的命名空间

时间:2013-04-29 17:09:36

标签: c++ c namespaces extern

我们有一个代码库,其中有.cpp和.h,它设置为使用gcc构建

我的理解是gcc将为相应的文件选择合适的编译器,所以我相信(并且测试让我几乎100%肯定)我们的.h文件被编译为c而我们的.cpp文件被编译为C ++。

我曾经尝试过更改为g ++并且遇到了一连串的错误,当我尝试使用.hpp时也是如此。

因此,为了解决这个问题,大多数时候我只需要使用extern C ++(例如包括地图时)

但是我似乎无法正确使用命名空间。我假设编译器抱怨我的命名空间,因为它被编译为.h?它是否正确。我当前的代码看起来像(在没有extern的情况下尝试之后):

在foo.h中

 extern "C++" {
 namespace Caching_Logic
 {
      class foo
      {
         ....
      }
 }
 }
在bar.h中

 extern "C++" {
       using namespace Caching_Logic; //completely defeats the point of namespaces
 }
 class bar
 {
   ....

          foo m_foo;

   ...
 }

两个文件都包含在.cpp文件中

编译时的错误是:

filethatusesbar.cpp:错误:'class bar'没有名为'm_foo'的成员

bar.h:错误:'Caching_Logic'不是名称空间名称

bar.h:错误:在';'标记

之前的预期名称空间名称

我正在考虑完全放弃命名空间,但我真的想为此设置代码范围!

----- ------ UPDATE

阅读http://www.network-theory.co.uk/docs/gccintro/gccintro_54.html

我对gcc的作用有了更好的理解。最初我读过某个地方,gcc在必要时用C ++编译,而在C中遇到.c

这是真的,但似乎链接器存在问题。由于这是作为一个库编译的,因此我之前没有看过任何问题。我猜这与我的范围问题,外部联系有关吗?

1 个答案:

答案 0 :(得分:1)

您的.h文件未编译为C.它们包含在您的* .cpp文件中,预处理的组合由C ++编译器编译。

验证在bar.h中的问题行之前的某处有#included foo.h.如果不这样做可能会导致编译器错误。喜欢在bar.h中#include它,最好知道它自己的物理依赖。

如评论所述,bar.h中的using指令被认为是有害的。请考虑使用此代码:

class bar {
    ....
    Caching_Logic::foo m_foo;