在C++程序中调用被C编译器编译后的函数,为什么要加extern “C”

C++语言是一种面向对象编程语言,支持函数重载,而C语言是面向过程的编程语言,不支持函数重载,所以函数被C++编译后在哭中的名字与C语言的不同,如果声明一个C语言函数float f(int a, char b),C++的编译器就会将这个名字变成像_f_int_char之类的东西以支持函数重载,然而C语言编译器的库一般不执行该转换,所以它的内部名为_f,这样连接器将无法解释C++对函数f()的调用。

C++提供了C语言Alternate likeage specifications(替换连接说明)符号extern “C”来解决名字匹配问题,extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在模块或其他模块中使用。extern后跟一个字符串来指定向声明的连接类型,后面是函数声明。

extern “C” float f(int a, char b);

该语句的目的是高速编译器f()是C连接的,这样C++就不会转换函数名。标准的连接类型执行符有“C”和“C++”两种,但编译器开发商也可以选择用同样的方法支持其他语言。如果有一组替代连接的声明,可以把它们放在花括号里:

extern “C” {

    float f(int a, char b);

…//其他函数

}

extern “C” {

    #include “Myheader.h”

…//其他C头文件

}

这就告诉C++编译器,函数f是C连接的,应该到库中找名字_f而不是找_f_int_char。C++编译器开发商已经对C标准库的头文件作了extern “C”处理,所以可以用#include直接引用这些头文件。

    原文作者:小肥羊的慢慢科研路
    原文地址: https://blog.csdn.net/summer00072/article/details/81544522
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞