C++链接指示:extern "C"

C++有时候需要调用其它语言编写的函数,最常见的是调用C语言编写的函数,对于其它语言编写的函数来说,编译器检查其调用的方式与处理普通C++函数的方式相同,但是生成的代码有所区别。

C++使用链接指示指出任意非C++函数所用的语言,例如extern "C",extern "Ada",extern "FORTRAN"等,双引号内区分大小写,extern "c"是错误的写法。

要想把C++代码和其他语言编写的代码放在一起使用,要求我们必须有权限访问该语言的编译器,并且这个编译器与当前的C++编译器是兼容的。

链接指示与函数

链接指示有两种形式,单个的或复合的,链接指示不能出现在类定义或函数定义内部。同样的链接指示必须在函数的每个声明中都出现。

extern "C" void testFunc(int value);

extern "C" {
    void testFunc1(int value);
    void testFunc2(int value);
}

链接指示与头文件

多重声明的形式可以应用于整个头文件,当一个#include指示被放置在复合链接指示的花括号中时,头文件中的所有普通函数声明都被认为是由链接指示的语言编写的。链接指示可以嵌套,因此如果头文件中包含带自带链接指示的函数,则该函数的链接不受影响。

extern "C" {
#include <windows.h>
}

链接指示与函数指针

指向其它语言编写的函数的指针必须与函数本身使用相同的链接指示,指向C函数的指针与指向C++函数的指针时不一样的类型。

当我们使用链接指示时,它不仅对函数有效,而且对作为返回类型或形参类型的函数指针也有效。

//下面函数的形参也是一个指向C函数的指针
extern "C" void testFunc(void(*)(int));

导出C++函数到其它语言

通过使用链接指示对函数进行定义,我们可以令一个C++函数在其他语言编写的程序中可用。

//下面函数可以被C程序调用
extern "C" void testFunc(int value);

对链接到C的预处理器的支持

有时候需要在C和C++中编译同一个源文件,这个时候可以利用预处理器定义__cplusplus使编译C++程序的时候包含一些代码进来。

#ifdef __cplusplus
extern "C"
#endif
void testFunc(int value);
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容