在两个名称空间中导出重复的函数(C ++)

时间:2013-02-27 20:12:51

标签: c++ function namespaces export duplicates

我有这两个名称空间,每个名称空间包含一个具有相同名称的函数,例如

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中。我收到关于它们之间冲突的警告,因为它们具有相同的名称,然后在链接时发生错误。我认为基于参数的名称在对象文件中被破坏了。我不知道链接器是否也关心命名空间。我怎么能做这个工作?感谢。

2 个答案:

答案 0 :(得分:2)

你不能直接这样做。当您使用extern "C"时,您声明函数被导出就像它们是C函数一样,而不是C ++。

这意味着(除其他外)

  1. 删除了命名空间,不会将其视为名称的一部分
  2. 由于参数完成没有名称错误
  3. 你能做的最好的事情是创造外部" 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"告诉编译器“不要破坏这个名字” - 但是(如你所说)你想要破坏。