我想在C链接的共享库中使用一些c ++类。我遇到了以下问题。
如果
#include <iostream>
extern "C"
{
void f(){}
}
成功编译和链接,但在结果库中找不到f()。
如果
extern "C"
{
#include <iostream>
void f(){}
}
我遇到了很多编译器错误(只是不知道如何正确地将它们翻译成英文,有关C语言链接的模板)在iostream和包含的标题中出现的每个C ++关键字“template”。
应该做什么?
答案 0 :(得分:4)
第一个变体是正确的。只有在C中存在的东西才能在extern "C"
块中声明,模板和类肯定不属于该类别。您只需要确保,如果您使用的是C ++编译器,那么您的函数也会在标题中声明为extern "C"
。这通常是通过编写
#ifdef __cplusplus
// C++ declarations (for example classes or functions that have C++ objects
// as parameters)
extern "C"
{
#endif
// C declarations (for example your function f)
#ifdef __cplusplus
}
#endif
标题中的。
答案 1 :(得分:2)
第一个是正确的;系统标头(以及大多数其他标头)
只能包含在全局范围内,任何名称空间,类之外,
功能或链接规范块。有可能的事情
在<iostream>
中不合法的extern "C"
,即使
没有,extern "C"
的名称几乎可以肯定
不同于C ++,并且库本身肯定是编译的
为extern "C++"
。
您是如何定义f
的?这可能是一个类似的问题:如果来源
file将其编译为extern "C++"
函数,然后名称将为。{
与编译它的客户端文件中的版本不同
extern "C"
函数。
这里的一般政策是处理标题和功能 定义/声明的方式与通常相同,除了 确保标头可以包含在C和C ++源中, e.g:
#if __cplusplus
extern "C" {
#endif
void f();
// Other `extern "C"` functions...
#if __cplusplus
}
#endif
然后在使用函数f()
的所有文件中包含此标头,
并在定义它的文件中。
答案 2 :(得分:0)