Gra*_*rks 13
如果你的函数是在.c文件中实现的,那么.cpp文件将需要extern"C"引用,否则它们会引用一个受损的C++风格的函数名,并且链接会失败.
从DLL导出函数也很方便,因此它们以非损坏的名称导出.
当C++
函数必须通过C
代码而不是C++
代码调用时,这是必要的.
基本上,当您希望C++
库向后兼容时.
有两种不同的用途extern "C"
.一种是在C++中定义一个你应该能够从CIe调用的函数,你用C++编写代码,但它需要与C代码接口.在这种情况下,您将函数定义为extern "C"
:
extern "C" {
int c_callable_func1() {}
int c_callable_func2() {}
}
Run Code Online (Sandbox Code Playgroud)
执行此操作时,这些函数的接口必须遵循与C中相同的规则(例如,您不能重载函数或使用任何参数的默认值).
另一个(更常见的)情况是你有用C编写的代码,你希望能够从C++调用.在这种情况下,函数定义与以前完全相同,但函数需要声明/原型化为extern "C"
.在典型情况下,您希望#include
在C或C++文件中使用单个标头,因此结构如下所示:
// myheader.h
#ifndef MY_HEADER_H_INCLUDED_
#define MY_HEADER_H_INCLUDED_
#ifdef __cplusplus
extern "C" {
#endif
int func1(void);
void func2(int);
#ifdef __cplusplus
}
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
因此,C++编译器将看到typedef
由extern "C"
块包围的函数声明(和s等),而C编译器将看到原型,而不是被它无法识别的东西包围.
在第一种情况下(C++函数可以从C调用),你通常会以相同的方式构造标题,所以如果需要你也可以用C++调用这些函数(但是在接口上,你仍然会失去C++的所有额外功能)函数重载).
归档时间: |
|
查看次数: |
1623 次 |
最近记录: |