extern"C"浅析

函数重载原理:编译器把重载的函数根据参数修饰成不同的函数名以便于区分,

比如void func(); 编译器可能会将函数名修饰成_func,当编译器碰到void func(int x),编译器可能将函数名修饰为func_int,不同的编译器修饰的成不同的函数名,每个编译器都不一样


因为c++需要支持重载函数,所以c和c++编译同一个函数会产生不同的函数名


在linux下测试结果:

c函数: void MyFunc(){} ,被编译成函数: MyFunc

c++函数:void MyFunc(){},被编译成函数: _Z6Myfuncv

这样就引起了在c++中调用c语言编写的一个模块中的函数时,根据c++的查找方式去链接这个模块中的函数就会发生链接错误

拿上面的举例:myfun用c语言就被编译成 MyFunc,c++去查找myfun时链接的是_Z6Myfuncv,而这时候就会找不到这个函数发生链接错误,解决方式就是用extern "c"解决,加上extern "c"声明,就是告诉编译器按c语言的方式去编译和链接

代码如下

c.h

#ifndef C_H//防止头文件重复包含,条件编译意思是如果没有定义C_H就执行#ifndef C_H/#endif之间的代码,如果定义了就不执行
#define C_H
#include<stdio.h>


#ifdef __cplusplus//这个宏在cpp文件中是默认定义的
extern "C" {
#endif /* __cplusplus */

void print();
	
	

#ifdef __cplusplus
}
#endif /* __cplusplus */


#endif
c.c

#include"c.h"
void print()
{
	printf("%s\n", "hello,hero");
}

main.cpp//c++程序调用c语言程序

#include "c.h"
#include<iostream>
using namespace std;
int main()
{
	print();
	system("pause");
}

结果如下:

如果没有加上extern "c"时,链接时会报错

头文件去掉extern "c"时代码如下

c.h

#ifndef C_H//防止头文件重复包含,条件编译意思是如果没有定义C_H就执行#ifndef C_H/#endif之间的代码,如果定义了就不执行
#define C_H
#include<stdio.h>


//#ifdef __cplusplus//这个宏在cpp文件中是默认定义的
//extern "C" {
//#endif /* __cplusplus */

void print();
	
	

//#ifdef __cplusplus
//}
//#endif /* __cplusplus */


#endif

编译结果如下:链接出错





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值