C++与C处理函数名
如果C++两个cpp源文件中函数名称相同,会出现如下错误(ave就是函数名)
"int __cdecl ave(void)" (?ave@@YAHXZ) 已经在 e.obj 中定义
如果两个C源文件函数名相同,就会出现如下错误
_ave 已经在 e.obj 中定义
但是,如果一个C源文件和CPP源文件函数名相同,它却不会发生错误
说明了在C源文件中,ave被处理成了_ave,而在CPP源文件中,被处理成了?ave@@YAHX,因为C++中为了标记重载函数,不仅重命名了ave,还给了参数不同的形式,YAHXJ就是不同的参数形式,而C不支持函数重载,所以把ave定义成了_ave就行了。
所以我们可以得出,如果一个CPP源文件要调用C文件中 的某个函数,那肯定是行不通的,毕竟处理后的名字都不相同了,编译器去找这个函数名,找的是ave@@YAHX,却只有_ave,肯定找不到,那么如何才能调用C风格的函数呢,就要用到关键字extern
extern “C”
语法:extern "c" 返回值类型 函数名()
告诉编译器这是一个C风格的函数,如果C++调用C里面的函数,编译器就会去找C风格处理后的函数,即_ave(),这样就能在C源文件里找到。我在这里卡了很久,代码没错,却总是报错,显示未找到该函数,很久以后,把电脑重启后,才编译成功,也许是VS的bug吧。另外为了保险起见,也可以函数声明和函数定义两部分都加上extern C。
#ifdef __cplusplus
我们学习了如何在C++中调用C文件,那如何从C文件中调用C++函数呢?一种方法是在C++源文件中告诉编译器这是个C风格的函数,如果不在源文件告诉,在头文件告诉的话,如果C文件又要调用这个头文件,就会报错,因为C语言没有这种写法,所以我们用另一种方法,就要用到下面的代码
在头文件前加入
#ifdef __cplusplus
extern "C"
#endif
这段代码意思就是如果是C++文件,就转换成C风格,如果不是C++文件,就不出现extern "c",这样如果C文件再调用这个头文件,就不会出错。
LINK4042
如果源文件下面有math.c和math.cpp,编译后就会报错,虽然是两个不同的源文件,但编译后都是math.obj,就会重名,会报错,解决办法就是另外取一个名字
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)