C++ 调用C语言、extern "C"、__cplusplus关键字
——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语言调用才行。
最新文章
- 在DevExpress中使用CameraControl控件进行摄像头图像采集
- Find linux下
- begin-end语句块在mysql中的使用问题
- docker-image container 基本操作 -常用命令
- git秘钥配置--转
- 六天玩转javascript:javascript变量与表达式(1)
- 结构体数组(C++)
- 算法之旅,直奔<;algorithm>;之十五 find
- BNU Box of Bricks
- cape town
- Windows phone 8 学习笔记(5) 图块与通知
- GitHub 简易使用
- mysql每组前N条
- 帝国cms如何调用指定id的文章到首页?
- PID控制器开发笔记(转)
- sql优化学习(一)
- win10 专业版 git bash 闪退问题终极解决方案
- Linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结(转)
- Android context空指针异常
- Java如何以不同国家的格式显示时间?
热门文章
- ubuntu E: Could not get lock /var/lib/apt/lists/lock 异常信息
- supsplk 服务器被植入木马 挖矿 cpu使用 700%
- python学习之路(7)
- springmvc文件上传 参数为MultipartFile 转换为File
- eclipse中解决update maven之后jre被改成1.5的问题
- MongoDB数据库的基本操作命令
- git设置mergetool可视化工具
- leetcode 200岛屿的个数
- java里poi操作excel的工具类(兼容各版本)
- web开发(四) 一次性验证码的代码实现