C++调用C库.doc_第1页
C++调用C库.doc_第2页
C++调用C库.doc_第3页
C++调用C库.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+调用C2009-06-26 15:31:11|分类:计算机|字号订阅以下是假设旧的C程序库C的头文件/*-c.h-*/#ifndef _C_H_#define _C_H_extern int add(int x, int y);#endifC的源文件/*-c.c-*/int add(int x, int y)return x+y;C+的调用/*-cpp.cpp-*/#include c.hvoid main()add(1, 0);这样编译会产生错误cpp.obj : error LNK2001: unresolved external symbol int _cdecl add(int,int) (email=?addYAHHHZ?addYAHHHZ/email),原因是找不到add的目标模块这才令我想起C+重载的函数命名方式和C函数的命名方式,让我们回顾一下:C中函数编译后命名会在函数名前加以_,比如add函数编译成obj文件时的实际命名为_add,而c+命名则不同,为了实现函数重载同样的函数名add因参数的不同会被编译成不同的名字例如int add(int , int)=addYAHHHZ,float add(float , float )=addYAMMMZ,以上是VC6的命名方式,不同的编译器会不同,总之不同的参数同样的函数名将编译成不同目标名,以便于函数重载是调用具体的函数。编译cpp.cpp中编译器在cpp文件中发现add(1, 0);的调用而函数声明为extern int add(int x, int y);编译器就决定去找email=addYAHHHZaddYAHHHZ/email,可惜他找不到,因为C的源文件把extern int add(int x, int y);编译成_add了;为了解决这个问题C+采用了extern C,这就是我们的主题,想要利用以前的C程序库,那么你就要学会它,我们可以看以下标准头文件你会发现,很多头文件都有以下的结构#ifndef _H#define _H#ifdef _cplusplusextern C #endifextern int f1(int, int);extern int f2(int, int);extern int f3(int, int);#ifdef _cplusplus#endif#endif /*_H*/如果我们仿制该头文件可以得到#ifndef _C_H_#define _C_H_#ifdef _cplusplusextern C #endifextern int add(int, int);#ifdef _cplusplus#endif#endif /* _C_H_ */这样编译/*-c.c-*/int add(int x, int y)return x+y;这时源文件为*.c,_cplusplus没有被定义,extern C 这时没有生效对于C他看到只是extern int add(int, int);add函数编译成_add(int, int);而编译c+源文件/*-cpp.cpp-*/#include c.hvoid main()add(1, 0);这时源文件为*.cpp,_cplusplus被定义,对于C+他看到的是extern C extern int add(int, int);编译器就会知道 add(1, 0);调用的C风格的函数,就会知道去c.obj中找_add(int, int)而不是email=addYAHHHZaddYAHHHZ/email;这也就为什么DLL中常看见extern C ,windows是采用C语言编制他首先要考虑到C可以正确调用这些DLL,而用户可能会使用C+而extern C 就会发生作用当原来的C语言写的头文件里面没有考虑这个问题的时候,可以写成这样:#include #include extern C #include sift.h#includ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论