C++和C的相互调用

C++和C相互调用实际工程中C++和C代码相互调用是不可避免的C++编译器能够兼容C语言的编译方式C++编译器会优先使用C++编译的方式extern关键字能强制让C++编译器进行C方式的编译

extern "C"{   // do C-style compilation here}

假设在C++中调用用C语言编写的库,如何来做?举个简单的小例子:

add.h

int add(int a, int b);

-----------------------------------

add.c#include "add.h"int add(int a,int b){   return a + b;}

gcc -c add.c -o add.o将会生成一个add.o的文件

-------------------------------------

main.cpp#include <stdio.h>#include "add.h"

int main(){   int c = add(1,3);   printf("c = %d\n",c);}编译:g++ main.cpp add.o编译出错:undefined reference to 'add(int ,int )'利用nm命令查看add.o中是否有add函数nm add.o,查看发现里面已经有了add函数。那么这个地方为什么提示没有呢

因为add.o是用C语言编译器进行编译的,而main.cpp是C++代码,它想调用C的代码,而C的代码已经被编译成目标文件了。此处需要强制让C++编译器使用C语言的编译器。main.cpp#include <stdio.h>extern "C"{#include "add.h"}

int main(){   int c = add(1,3);   printf("c = %d\n",c);}

-----------------------------------------------------------------------------------------

如何保证一段C代码只会以C的方式被编译?利用extern "C"不就可以了吗?注意:extern "C"是C++中才有的,C语言中不支持extern "C"这样的写法。现在要保证的是一段C代码只会以C的方式被编译,不管是C++编译器还是C语言编译器。

你可能还是会说,我就用extern "C"。当采用C语言编译器编译带有extern "C"的语句时,是编译不过的。解决方案:__cplusplus是C++编译器内置的标准宏定义__cplusplus的意义确保C代码以统一的C方式被编译成目标文件#ifdef __cplusplusextern "C" {#endif

//C-Style Complitation

#ifdef __cplusplus}#endif--------------------------------------

main.c
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif

#include "add.h"

#ifdef __cplusplus
}
#endif

int main()
{
    int c = add(1,2);
    printf("c=%d\n",c);
    return 0;
}

这样用C语言编译器就通过了同样利用C++编译器也能编译过。

注意事项:C++编译器不能以C的方式编译重载函数编译方式决定函数名被编译后的目标名-C++编译方式将函数名和参数列表编译成目标名 (可以编译完成后,用nm命令查看)-C编译方式只将函数名作为目标名进行编译

小结:函数重载是C++对C的一个重要升级函数重载通过函数参数列表区分不同的同名函数extern关键字能够实现C和C++的相互调用。(extern代码块中,不能有重载函数)编译方式决定符号表中的函数名的最终目标名。

本质上是不允许函数名相同的,只不过C++编译器在编译的时候,将参数作为了函数名的一部分。这就是为什么函数名相同还能编译过的地方。而C语言就不行(它在编译的时候,函数名就是函数名,没有参数列表,因此就无法区分同名函数了,因此就没有重载的概念了),这就是因为编译方式的不同,导致的结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值