我有这两个名称空间,每个名称空间包含一个具有相同名称的函数,例如
namespace group1 {
void add(int arg) {
}
}
namespace group2 {
void add(bool arg) {
}
}
我在声明
的标题中指定了这个#ifdef __cplusplus
extern "C" {
#endif
// My namespaces and functions prototypes here
#ifdef __cplusplus
}
#endif
我试图将它们导出到带有GCC的DLL中。我收到关于它们之间冲突的警告,因为它们具有相同的名称,然后在链接时发生错误。我认为基于参数的名称在对象文件中被破坏了。我不知道链接器是否也关心命名空间。我怎么能做这个工作?感谢。
答案 0 :(得分:2)
你不能直接这样做。当您使用extern "C"
时,您声明函数被导出就像它们是C函数一样,而不是C ++。
这意味着(除其他外)
你能做的最好的事情是创造外部" C"重定向的函数。
#ifdef __cplusplus
extern "C" {
#endif
void group1_add(int arg);
void group2_add(bool arg);
#ifdef __cplusplus
}
#endif
然后,包装器函数的实现将适当地使用group1::add()
或group2::add()
。
答案 1 :(得分:2)
如果这些是C ++函数,则必须删除extern "C"
包围:
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
extern "C"
告诉编译器“不要破坏这个名字” - 但是(如你所说)你想要破坏。