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语言调用才行。
C++ 调用C语言、extern "C"、__cplusplus关键字的更多相关文章
- JAVA调用C语言写的SO文件
JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 // 用JNI实现 // 实例: ...
- C++中extern “C”含义及extern、static关键字浅析
https://blog.csdn.net/bzhxuexi/article/details/31782445 1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C ...
- Java语言与C语言混合编程(2)--在Java中调用C语言本地库
在上一篇文章中介绍了Java语言中的native关键字,以及Java语言调用C语言的编译生成本地动态链接库(DLL)实现加法运算的小例子,本文通过一个更加详细的例子,深入讲解Java语言调用C语言的函 ...
- 通过实例简介python使用ctypes模块调用C语言动态库
看介绍python语言时,说它是胶水语言,可以调用其他语言.通过使用ctypes模块就可以调用C语言的动态库.下面先放上官方文档和几个比较好的博文. 1.官方文档:http://python.net/ ...
- java jni 调用c语言函数
今日在hibernate源代码中遇到了native关键词,甚是陌生,就查了点资料,对native是什么东西有了那么一点了解,并做一小记. native关键字说明其修饰的方法是一个原生态方法,方法对应的 ...
- 分享:写了一个 java 调用 C语言 开发的动态库的范例
分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h 代码#pragma once#ifdef __cplusplusextern "C" {#e ...
- Java如何调用C语言程序,JNI技术
Java为什么要调用C语言编写的程序因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就做不了,只能交给C语 ...
- C语言入门:03.关键字、标识符、注释
一.学习语法之前的提醒 (1)C语言属于一门高级语言,其实,所有高级语言的基本语法组成部分都是一样的,只是表现形式不太一样 (2)就好像亚洲人和非洲人,大家都有人类的结构:2只 手.2只脚.1个头,只 ...
- 在Windows Phone项目中调用C语言DLL
在Windows Phone项目中调用C语言写的DLL 最近接到一个需求,需要在WP里调用一个C语言写的DLL,并且说Android和iOS都可以,问我WP是否可以这样? 我说我调研一下,就有了下面的 ...
随机推荐
- BZOJ 2655 calc (组合计数、DP、多项式、拉格朗日插值)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2655 题解 据说有一种神仙容斥做法,但我不会. 以及貌似网上大多数人的dp和我的做法都不 ...
- You Are Given a Decimal String...
B. You Are Given a Decimal String... 这个题需要求出从某一个尾数 n 变为 m 所需要的 x 和 y 的最小个数(i+j) 那么就需要预处理出一个数组来存放这个值. ...
- idea为项目添加ignore文件忽略unversion的文件
最近初学Git,而且在使用的IDE是IntelliJ IDEA,发现IDEA在提交项目到本地仓库的时候,会把.idea文件夹中的内容也提交上去,这里面放的是一些项目的配置信息,包括历史记录,版本控制信 ...
- java.lang.Integer.MAX_VALUE;这是什么意思?
这个是Integer类中的一个int类型的常量MAX_VALUE它代表int所能表示的最大值 0x7FFFFFFF 相对应的是Integer类中的另一个常量MIN_VALUE它代表int所能表示的最小 ...
- 我的 CSDN 博客目录索引(主要记录了我学习视频、书籍的笔记,持续更新中)
我的 CSDN 博客地址: lw_power的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/lw_power 佟刚老师<Spring4视频教程>学习笔记 ...
- LeetCode 16. 最接近的三数之和(3Sum Closest)
题目描述 给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯一答案. 例 ...
- Note: Bigtable, A Distributed Storage System for Structured Data
Abstract Introduction:: Bigtable设计主旨:可扩地扩展到pByte级别和数千台机器的系统, 通用.可伸缩.高性能.高可用性. 不实现完整的关系数据模型,而是支持一个可 ...
- WIN10下命令行禁用编辑模式
在开发的时候 控制台输出信息 点一下右键就进入编辑模式了,WIN7没有这个问题.网上搜了一下 说是要 禁用编辑模式,下面是代码VS2005可用 { #ifndef ENABLE_EXTENDED_FL ...
- 使用多个梯度下降的方式进行测试,同时使用ops.apply_gradient进行梯度的下降
1. ops = tf.train.GradientDescentOptimizer(learning_rate) 构建优化器 参数说明:learning_rate 表示输入的学习率 2.ops.co ...
- php array function
说明:不特殊说明都支持php4,5,7 参考:https://www.php.net/manual/zh/ref.array.php is_array ( mixed $var ) : bool ...