——C++编译器完全兼容C语言的编译方式。(但是得有源代码)

——C++编译器会优先使用C++的编译方式进行编译

——extern "C" 关键字能够强制C++编译器进行C方式的编译

  学习目标:实现C语言与C++之间的互相调用

       学习 extern "C" {} 关键字

       学习 __cplusplus标准宏

实验一、通过C++调用C编译器编译出来的   .o  文件 (extern "C" 关键字使用)

  1、创建文件:add.c    

int add(int a,int b)
{
return a+b;
}  

  2、创建:add.h  

int add(int a,int b);//对函数进行声明

  3、使用C编译进行add.c 进行编译 gcc -c add.c -o add.o 生成.o文件   nm add.o //add.o中的符号表信息 

 T add

  4、创建:main.cpp  

  #include <stadio.h>
#include "add.h"
int main(int argc, char *argv[])
{
printf("Begin...\n");
int c = ;
c = add(,)
printf("c = %d\n",c);
printf("End...\n");
return ;
}

  5、编译:g++ main.cpp add.o

  输出错误信息:
/tmp/cc6HoeKB.o: In function `main':
main.cpp:(.text+0x2d): undefined reference to `add(int, int)'
collect2: error: ld returned exit status

  从上面错误可以看出 add 这个函数是没有定义的。

  6、修改main.cpp 使用关键字  extern "C" {需要编译器进行C方式编译的部分}  

  #include <stadio.h>
extern "C"
{
#include "add.h"
}
int main(int argc, char *argv[])
{
printf("Begin...\n");
int c = ;
c = add(,)
printf("c = %d\n",c);
printf("End...\n");
return ;
}

  

  编译:g++ main.cpp add.o
  编译成功。
  运行结果:  

  Begin...
  c =
  End...

 

实验2 _Cplusplus关键字使用,__cplusplus关键字 是C++编译器内置的标准宏定义

  确保C代码能够以统一的方式被编译成目标文件。  

#include <stdio.h>
#ifdef __cplusplus //如果 __cplusplus被定义 ,__cplusplus只有C++中才有 成立则表示为C++编译器
//使用__cplusplus来判定是否需要将 extern "C"{}加入到编译中来。实现同一段代可以使用C、C++编译器编译
extern "C"
{
#endif #include "add.h" #ifdef __cplusplus
}
#endif int main(int argc, char *argv[])
{
printf("Begin...\n");
int c = ;
c = add(,);
printf("c = %d\n",c);
printf("End...\n");
return ;
}

  注意:C++编译器不能以C的方式来编译重载函数。

      编译方式决定函数名被编译后的目标名(C 目标名.o  C++ .oo)

      C++编译方式将 函数名  参数列表  编译成  目标名

      C编译方式只将 函数名 作为目标 (所以对应上了C++编译器不能以C的方式来编译重载函数。这句话)

实验三、使用C来调用C++编译的目标文件(.oo)

    1、创建add.cpp    

#include "add.h"

int add(int a,int b)
{
return a+b;
}

  2、创建add.h头文件  

#ifdef __cplusplus//如果是C++编译器
extern "C"{//下面部分使用C语言的编译方式进行编译
#endif int add(int a,int b);
#ifdef __cplusplus
}
#endif

  3、编译add.cpp 目标文件 g++ -c add.c -o add.oo

  4、创建main.c    

#include <stdio.h>
#include "add.h" int main(int argc, char *argv[])
{
int c = ;
printf("Begin...\n");
c = add(,);
printf("c = %d\n",c);
printf("End...\n");
return ;
}

  5、编译C程序生成.out 文件  gcc main.c add.oo

  6、运行结果:  

Begin...
c =
End...

小结:

  使用C语言来调用C++关键还是在 extern "C" {} 关键字。强制C++编译器使用C语言的方式来编译{}内的代码。

  只有C++编译出来的文件支持C语言调用才行。

最新文章

  1. 在DevExpress中使用CameraControl控件进行摄像头图像采集
  2. Find linux下
  3. begin-end语句块在mysql中的使用问题
  4. docker-image container 基本操作 -常用命令
  5. git秘钥配置--转
  6. 六天玩转javascript:javascript变量与表达式(1)
  7. 结构体数组(C++)
  8. 算法之旅,直奔&lt;algorithm&gt;之十五 find
  9. BNU Box of Bricks
  10. cape town
  11. Windows phone 8 学习笔记(5) 图块与通知
  12. GitHub 简易使用
  13. mysql每组前N条
  14. 帝国cms如何调用指定id的文章到首页?
  15. PID控制器开发笔记(转)
  16. sql优化学习(一)
  17. win10 专业版 git bash 闪退问题终极解决方案
  18. Linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结(转)
  19. Android context空指针异常
  20. Java如何以不同国家的格式显示时间?

热门文章

  1. ubuntu E: Could not get lock /var/lib/apt/lists/lock 异常信息
  2. supsplk 服务器被植入木马 挖矿 cpu使用 700%
  3. python学习之路(7)
  4. springmvc文件上传 参数为MultipartFile 转换为File
  5. eclipse中解决update maven之后jre被改成1.5的问题
  6. MongoDB数据库的基本操作命令
  7. git设置mergetool可视化工具
  8. leetcode 200岛屿的个数
  9. java里poi操作excel的工具类(兼容各版本)
  10. web开发(四) 一次性验证码的代码实现