在C++中如何使用C

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在C++中如何使⽤C
如下代码:
/*C语⾔头⽂件:Max.h*/
#ifndef _MAX_H_
#define _MAX_H_
int Max(int nA,int nB)
#endif
/*C语⾔实现⽂件:Max.c*/
#include "Max.h"
int Max(int nA,int nB)
{
return((nA-nB)?(nA):(nB));
}
/*C++语⾔调⽤⽂件*/
#include "Max.h"
int _tmain(int argc,char* argv[])
{
int nMax = Max(1,2);
return 0;
}
上述代码在Visual C++中编译会出错(error LNK2019:⽆法解析的外部符号"int __cdecl Max(int,int)"(?Max@@YAHHH@Z),该符号在函数_wmain中被引⽤
如果把上述的Max.h代码修改如下:
/*C语⾔头⽂件*/
#ifndef __MAX_H__
#define __MAX_H__
#ifdef __cplusplus
extern "C"{
#endif
int Max(int nA,int nB);
#ifdef __cplusplus
};
#endif
#endif
编译通过
结论:在C++中调⽤C的代码必须把原来的C语⾔声明放到extern "C"{/*code*/}中,否则在C++中⽆法编译通过
原因:C和C++具有完全不同的编译和链接⽅式。

C语⾔编译器编译函数时不带函数的类型和作⽤域信息,只包含函数符号名字;⽽c++编译器为了实现函数的重载,在编译时会带上函数的类型和作⽤域信息。

例如:假如某⼀函数原型为:int Func(int nA,int nB)
C语⾔编译器把函数编译成类似_Func的符号,C链接器只要找到这个符号就可以连接成功,实现调⽤。

⽽在C++语⾔中,编译器会检查参数类型和作⽤域信息,上述函数原型会编译成_Z_Func_int_int这样的符号。

在链接过程中,C++链接器会在函数原型所在模块⽣成的⽬标⽂件中查找__Z_Func_int_int.
总结:C++中调⽤C代码的3种具体实现⽅式
1.修改C代码的头⽂件,当其被⽤于C++代码时,在声明中加⼊exter "C" 上例中在Max.h中加⼊extern "C" int Max(int nA,int nB);
2.在C++代码中(Main.cpp)重新声明⼀下C函数,在重新声明时添加extern "C".
#include "Max.h"
extern "C" int Max(int nA,int nB);
3.在包含C头⽂件(Main.cpp)时,添加extern "C".
extern "C"{
#include "Max.h"
}
注意:extern "C" ⼀定要加在C++的代码⽂件中才起作⽤。

相关文档
最新文档