1

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

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

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

所以为了解决这个问题,大多数时候我只是在需要时使用 extern C++(例如,当包含地图时)

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

在 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”的成员</p>

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

bar.h:错误:“;”之前的预期命名空间名称 令牌

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

- - -更新 - - -

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

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

这是真的,但似乎链接器存在问题。由于这是作为库编译的,因此我以前从未见过问题是有道理的。我猜这与我的范围问题有关,外部链接?

4

1 回答 1

1

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

确认您在 bar.h 中的问题行之前的某处有 #included foo.h。否则可能会导致编译器错误。更喜欢 #include 它在 bar.h 中,它最清楚自己的物理依赖关系。

正如评论所指出的,bar.h 中的 using 指令被认为是有害的。考虑改用这个:

class bar {
    ....
    Caching_Logic::foo m_foo;
于 2013-04-29T17:12:50.163 回答