命名空间和外部'C'编译错误

时间:2015-06-18 10:08:38

标签: c c++11

我试图谷歌错误但无济于事。也许我在寻找错误的方向。 我正在尝试编译一个文件但是当我厌倦编译它时,编译器给了我这些错误:

C2059语法错误:';'
C2059语法错误:'}'
C2061语法错误:标识符'namespace_name'
C2449语法错误:在文件范围内找到“{”(缺少标题?)

在我的code.c文件中:

#ifndef myclass_c
#define myclass_c

#include "classA.h"
#include "classB.h"   
#include "conversionLib.h" // no namespace is being used here

namespace namespace_name {

// ... generated codes in C....
}
#endif

在classA.h和classB.h中:

#ifndef myclassA_h // myClassB_h if in classB
#define myclassA_h // myClassB_h if in classB

#include "classC.h"  // both classA and classB include classC.h

namespace namespace_name {
#ifdef __cplusplus
extern "C" {
#endif

// ... generated codes in C....

#ifdef __cplusplus
}
#endif
}
#endif

并在classC.h中(对于classD.h也是如此)

#ifndef myclassC_h // myclassD.h for classD.h
#define myclassC_h // myclassD.h for classD.h

#include "classD.h"  // no includes in classD.h

namespace namespace_name {
#ifdef __cplusplus
extern "C" {
#endif

// ... generated codes in C....

#ifdef __cplusplus
}
#endif
}
#endif
我在做错了什么?还是我错过了什么? 任何建议将不胜感激。 如果这个问题/格式令人困惑,我道歉。 提前致谢

1 个答案:

答案 0 :(得分:0)

主要问题似乎是,您在.c文件中使用c ++语法。 C不支持名称空间!

extern "C"函数放入命名空间没有多大意义。在C ++中,编译器执行称为“名称管理”的操作,它实际上将名称空间(例如,类名,命名空间)和标识符的附加信息(如函数或模板参数)放入其符号名称中,该符号名称是链接器的输入

extern "C"告诉C ++编译器不要这样做。所以你失去了对周围命名空间的绑定(以及重载函数的可能性)。

如果将函数放在特殊的命名空间中,如果它们是从C ++中包含的话,那么将它们放在一个很好的想法中,但另一方面,大多数在C命名空间中使用函数名的特殊前缀来构建y。所以在C ++中,你最终得到了显式的c ++名称空间和隐式的函数前缀名称空间。

如果您仍希望在C-Functions中使用c ++中的命名空间,则必须将命名空间定义包含在#ifdef __cplusplus块中。 (但我甚至不知道C ++标准是否允许这样做)