C/C++混合编程--extern “C” 使用方法详解

1. 首先要明白:
被extern “C”修饰的变量和函数是按照C语言方式编译和链接的
(1) 首先看看C++中对类似C的函数是怎样编译的。
C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:
void foo( int x, int y );
该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。

2. 在C++和C混合编程时:
在C++和C语言混合编程时,C++的语法是完全包含C语言的语法的,所以不用担心语法上出现什么问题。出现问题的主要原因在编译链接时。
错误的案例:

//head.h 头文件
void print(int a, int b);

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

//head.c  C语言的实现文件
#include <stdio.h>
#include "head.h"
void print(int a, int b)
{
	printf("这里调用的是C语言的函数:%d,%d\n", a, b);
}

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

//main.cpp 调用head.h中的print函数
#include "head.h"  
#include <stdio.h>  
#include <stdlib.h>  
int main(int argc, char **argv)
{
	print(1, 2);
	return(0);
}

错误信息:1>main.obj : error LNK2019: 无法解析的外部符号 “void __cdecl print(int,int)” (?print@@YAXHH@Z),该符号在函数 _main 中被引用

正确的案例:C++/C混合编程的万能公式
解决方案:仅仅需要在head.h头文件中,添加#ifdef __cplusplus extern “C”

//head.h 头文件
#ifdef  __cplusplus   //如果当前使用的是C++编译器
extern "C" {          //用C的方式编译声明的函数
#endif  

	extern void print(int a, int b);

#ifdef  __cplusplus  
}
#endif  /* end of __cplusplus */  

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

//head.c  C语言的实现文件
#include <stdio.h>
#include "head.h"
void print(int a, int b)
{
	printf("这里调用的是C语言的函数:%d,%d\n", a, b);
}

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

//main.cpp 调用head.h中的print函数
#include "head.h"  
#include <stdio.h>  
#include <stdlib.h>  
int main(int argc, char **argv)
{
	print(1, 2);
	return(0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值