我们有一个代码库,其中有.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
这是真的,但似乎链接器存在问题。由于这是作为一个库编译的,因此我之前没有看过任何问题。我猜这与我的范围问题,外部联系有关吗?
答案 0 :(得分:1)
您的.h文件未编译为C.它们包含在您的* .cpp文件中,预处理的组合由C ++编译器编译。
验证在bar.h中的问题行之前的某处有#included foo.h.如果不这样做可能会导致编译器错误。喜欢在bar.h中#include它,最好知道它自己的物理依赖。
如评论所述,bar.h中的using指令被认为是有害的。请考虑使用此代码:
class bar {
....
Caching_Logic::foo m_foo;