我试图谷歌错误但无济于事。也许我在寻找错误的方向。 我正在尝试编译一个文件但是当我厌倦编译它时,编译器给了我这些错误:
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
我在做错了什么?还是我错过了什么?
任何建议将不胜感激。
如果这个问题/格式令人困惑,我道歉。
提前致谢
答案 0 :(得分:0)
主要问题似乎是,您在.c
文件中使用c ++语法。
C不支持名称空间!
将extern "C"
函数放入命名空间没有多大意义。在C ++中,编译器执行称为“名称管理”的操作,它实际上将名称空间(例如,类名,命名空间)和标识符的附加信息(如函数或模板参数)放入其符号名称中,该符号名称是链接器的输入
extern "C"
告诉C ++编译器不要这样做。所以你失去了对周围命名空间的绑定(以及重载函数的可能性)。
如果将函数放在特殊的命名空间中,如果它们是从C ++中包含的话,那么将它们放在一个很好的想法中,但另一方面,大多数在C命名空间中使用函数名的特殊前缀来构建y。所以在C ++中,你最终得到了显式的c ++名称空间和隐式的函数前缀名称空间。
如果您仍希望在C-Functions中使用c ++中的命名空间,则必须将命名空间定义包含在#ifdef __cplusplus
块中。 (但我甚至不知道C ++标准是否允许这样做)