03-extern-C
时间:2019-02-16
本文章向大家介绍03-extern-C,主要包括03-extern-C使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
写在前面
今天学一个修饰的关键字 extern "C",都说C++是C的一个特别实现,所以完全兼容C语法,
被extern "C"修饰的代码会按照C语言的方式去编译
名词解释
如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现可以不修饰
由于C、C++编译规则的不同,在C、C++混合开发时,
可能会经常出现以下操作 C++在调用C语言API时,需要使用extern "C"修饰C语言的函数声明
有时也会在编写C语言代码中直接使用extern “C” ,这样就可以直接被C++调用
码上封口
#include <iostream>
using namespace std;
// C语言库
extern "C" void func() {
std::cout << "func()" << std::endl;
}
int main() {
func();
}
//打印结果 func()
进阶一下
新建一个C++ 文件,会生成一个.cpp和.hpp的文件,和OC有点类似,
用法也和OC类似,在.hpp声明要暴露外面的方法,在.cpp是该方法的实现。
写一个简单的加法函数sum。
"在.hpp中"
#ifndef sum_hpp
#define sum_hpp
#include <stdio.h>
//函数声明
int sum(int a, int b);
#endif /* sum_hpp */
'在.cpp中'
#include "sum.hpp"
// _sum
int sum(int a, int b) {
return a + b;
}
'在main.mm中'
#include <iostream>
#import "sum.hpp"
using namespace std;
// C语言库
extern "C" void func() {
std::cout << "func()" << std::endl;
}
int main() {
func();
cout << "sum的和是:" << sum(2, 4) << endl;
}
运行一下结果是:
func()
sum的和是:6
卧槽:不知不觉把.mm中如何调用C++给泄露了。
哎,不对啊,没有C++ 文件代用C文件,好,我补上。
为了区别,创建一个C文件,文件名为minus
码上封喉
'在minus.h中'
#ifndef minus_h
#define minus_h
//通过使用宏__cplusplus来区分C、C++环境 现在表明是C++环境
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
int minus(int a, int b);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // !__SUM_H
'在minus.c中'
#include "minus.h"
int minus(int a, int b) {
return a - b;
}
'在sum.hpp中'
添加测试函数声明 int testMinus(int a, int b);
#ifndef sum_hpp
#define sum_hpp
#include <stdio.h>
//函数声明
int sum(int a, int b);
int testMinus(int a, int b);
#endif /* sum_hpp */
'在sum.cpp中'
添加函数实现
#include "sum.hpp"
#include "minus.h"
// _sum
int sum(int a, int b) {
return a + b;
}
int testMinus(int a, int b) {
return minus(a, b);
}
'在main.mm中'
添加函数调用
#include <iostream>
#import "sum.hpp"
using namespace std;
// C语言库
extern "C" void func() {
std::cout << "func()" << std::endl;
}
int main() {
func();
cout << "sum的和是:" << sum(2, 4) << endl;
cout << "minus的结果是:" << testMinus(8, 4) << endl;
}
看下打印结果:
func()
sum的和是:6
minus的结果是:4
今天的课程算是结束了,希望你也能有所收获。
完整代码demo,请移步GitHub:DDGLearningCpp
当然C++大神就绕吧,非喜勿喷,毕竟这是个人的学习笔记
- 开发 | 图片数据集太少?看我七十二变,Keras Image Data Augmentation 各参数详解
- linux过滤空文件的命令总结(r2笔记40天)
- shell脚本自动化采集性能sql(r2笔记39天)
- R语言与点估计学习笔记(EM算法与Bootstrap法)
- 开发 | 为个人深度学习机器选择合适的配置
- 阿里音乐流行趋势预测竞赛数据清洗整合——纯python
- 生产环境sql语句调优实战第二篇(r2第38天)
- 生产环境sql语句调优实战第三篇(r2笔记38天)
- 简单易学的机器学习算法——K-Means算法
- 通过shell脚本定位性能sql和生成报告(r2笔记37天)
- VXFS启用异步IO导致的严重问题(r2笔记56天)
- 通过sql语句分析足彩(r2笔记55天)
- 关于验证表中有无数据的方法比较(r2笔记54天)
- 海量数据迁移之分区并行抽取(r2笔记53天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法