c++和c语言中的函数相互调用的问题

1、如何C++程序要调用 已编译后的C函数,该怎么办?

(1)假设某个C函数的声明如下:

void foo(int x, int y);

该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像 _foo_int_int之类的名字用来支持重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C函数。C++提供了一个C连接交换指定符号extern "C"来解决这个问题

如:

extern "C"

{

void foo(int x, int y);

...//其它函数

}

或者

extern "C"

{

#include "myheader.h"

..//其它头文件

}

这就告诉C++编译器,函数foo是个c连接,应该到库中找名字_foo而不是找_foo_int_int。

另外说明一点:C++编译器开发商已经对C标准库的头文件作了extern "C"处理,所以我们可以用#include 在C++程序中直接引用这些头文件。


(2)如何理解extern "C"

extern "C"包含双重含义,从字面上即可得到:首先,被它修饰的目标是extern的, 其次,被它修饰的目标是"C"的,让我们来详细介绍解读这两重含义

被extern "C"限定的函数或变量是extern类型的

extern是c/c++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。记住,下列语句

extern int a;

仅仅是一个变量的声明,其实并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作业一种全局变量只能被定义一次,否则会出现连接错误。

通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明,例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需要包含模块A的头文件即可。这样,模块B中调用 模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错,它会在连接阶段中从模块A编译生成的目标代码中找到此函数

     与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern "C"修饰。

     被extern "C"修饰的变量和函数是按照C语言方式编译和连接的


未加extern"C" 声明时的编译方式

       首先看看C++编译器对类似C的函数是怎样编译的。

      作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:

void foo(int x ,int y);

该函数被C编译器编译后在符号库中的名字为_foo, 而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为"mangled name")。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的,例如,在C++中,函数void foo(int x, int y)与void foo(int x, float y)编译生成的符号是不相同的,后者为_foo_int_float。同样的,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以"."来区分。而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。


extern "C"的惯用法

(1)在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:

extern "C"

{

   #include "cExample.h"

}

而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern ”C" 声明,在.c文件中包含了extern "C"时会出现编译语法错误。因此,我们经常会做如下处理:
#ifdef _cpluscplus
#define GENERAL_EXTERN extern "C"

#else

#define GENERAL_EXTERN  extern



2、在c中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在c语言不能直接引用 声明了extern "C"的该头文件,应该仅将c文件中将C++中定义的extern ”C"函数声明为extern 类型

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C语言C++可以通过以下几种方法进行互相调用: 1. 通过 extern "C" 声明:C++ 语言支持 extern "C" 声明,可以将 C++ 语言函数使用 C 语言的约定方式进行编译,从而可以被 C 语言调用。在 C++ ,通过在函数声明前加上 extern "C" 关键字,可以将该函数使用 C 语言的命名规则和调用约定进行编译。例如: ```c++ // C++ 函数声明 extern "C" { int add(int a, int b); } // C 语言函数调用 int result = add(1, 2); ``` 2. 通过头文件声明:在 C++ 调用 C 语言的函数时,需要将 C 语言的函数声明放在 extern "C" 的花括号,并将其放在头文件。在 C++ 包含该头文件后,就可以使用 C 语言函数了。例如: ```c // C 语言的头文件 #ifdef __cplusplus extern "C" { #endif int add(int a, int b); #ifdef __cplusplus } #endif // C++ 包含头文件并调用函数 #include "c_functions.h" int main() { int result = add(1, 2); return 0; } ``` 3. 使用 extern 声明:在 C++ 定义的函数可以通过 extern 声明,在 C 语言进行调用。在 C++ ,可以在函数声明前加上 extern 关键字,并使用 C 语言的命名规则进行函数命名。在 C 语言,可以使用该函数的 C 语言方式的名称进行调用。例如: ```c++ // C++ 定义的函数 extern "C" { int cpp_add(int a, int b) { return a + b; } } // C 语言调用函数 int result = cpp_add(1, 2); ``` 上述方法可以使得 C 语言和 C++ 语言之间进行函数调用和数据传递,从而实现两种语言的相互调用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值