0

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

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 中。我收到有关它们之间冲突的警告,因为它们具有相同的名称,然后在链接时出错。我认为该名称也基于参数在目标文件中被破坏。我不知道链接器是否也关心命名空间。我怎样才能使这项工作?谢谢。

4

2 回答 2

2

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

这意味着(除其他外)

  1. 命名空间被删除,并且不被视为名称的一部分
  2. 没有因参数而修改名称

您可以做的最好的事情是创建重定向的外部“C”函数。

#ifdef __cplusplus 
    extern "C" {
#endif
    void group1_add(int arg);
    void group2_add(bool arg);
#ifdef __cplusplus 
    }
#endif

然后包装函数的实现将使用其中一个group1::add()group2::add()酌情使用。

于 2013-02-27T20:16:51.650 回答
2

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

#ifdef __cplusplus 
    extern "C" {
#endif

#ifdef __cplusplus 
    }
#endif

extern "C"告诉编译器“不要修改这个名字”——但是(正如你所说)你想要修改。

于 2013-02-27T20:18:17.690 回答