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

Export duplicated functions in two namespaces (C++)

本文关键字:函数 c++ 两个 命名空间      更新时间:2023-10-16

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

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

和我试图将它们导出到DLL中,与GCC。我得到一个关于它们之间冲突的警告,因为它们有相同的名称,然后在链接时出现错误。根据参数,我认为对象文件中的名称也被打乱了。我不知道链接器是否也关心名称空间。我该怎么做呢?谢谢。

如果这些是c++函数,则必须删除extern "C"括号:

#ifdef __cplusplus 
    extern "C" {
#endif
#ifdef __cplusplus 
    }
#endif

extern "C"告诉编译器"不要混淆这个名字"——但是(正如您所说)您想要混淆。

你不能直接这么做。当您使用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()