IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++中的extern “C“的作用 -> 正文阅读

[C++知识库]C++中的extern “C“的作用

🌟
😊😊😊
📝


📝 extern C的用法

简单来讲,被extern "C"修饰的代码将按照C语言的方式去编译

extern "C" {}

extren C 将代码按照C语言的的方式去编译

加入我们需要在项目中需要使用到C语言的第三方库/框架,那么相当于C与C++联合开发

对函数使用时将extern “C” 放在函数声明前面,而并不放在函数定义前面;两个地方都放也是可以的

extern "C" int add(int x, int y);
int main() {
	cout << add(10,20) << endl;
}

int add(int x, int y) {
	return x + y;
}

考虑错误的情况

extern "C" int add(int x, int y);
int add(int x, int y);
//显然这两个函数同时存在的,会引发歧义
int main() {
	cout << add(10,20) << endl;
}

int add(int x, int y) {
	return x + y;
}
int add(int x, int y) {
	return x + y;
}
//报错!!!

回顾:在重载时,也有类似歧义的场景。两个函数名是不能相同的,会引发歧义,即二义性。


📝 C与C++混合

假设以c语言创建了一个math函数,实现加减乘除的函数
那么在C++文件使用时直接进行如下定义

extern "C" {  //需要定义该头文件,存放math.c的函数声明
#include "math.h"
}
//但是要注意,C语言文件下是无法使用该方法的
//当我们再想在C程序里也想用被extern "C"修饰的代码,相当于这部分我想让C和C++都可以使用
//希望实现在C文件里就去掉extern "C" ,而遇到C++环境就加上
#define __cplusplus  //这个宏就是C++文件默认会定义的,只要是C++文件就会有,而C文件是没有的

我们可以使用宏,结合条件编译,实现我们的想法

#define __cplusplus //这个宏就是C++文件默认会定义的,只要是C++文件就会有,而C文件是没有的

例如:在math.c里定义C语言的求和函数,并在math.h头文件里使用如下方法进行修饰:

#ifdef __cplusplus
extern "C" {
#endif 
	int sum(int x, int y);

#ifdef __cplusplus
}
#endif

即在头文件里我们使用条件编译,检测到环境是C++时就加上extern “C”
在这里插入图片描述

验证在C环境下也能使用:

在这里插入图片描述

那么很显然,这样就实现了sum函数既可以在C编译环境下使用,也可以在C++编译环境下使用。


总结

将上述例子直观理解就是把头文件的包含直接替换:

C++:(test.cpp)

//#include "math.h"  //相当于替换如下
#ifdef __cplusplus
extern "C" {
#endif 
	int sum(int x, int y);

#ifdef __cplusplus
}
#endif
//并测试C也能使用sum
extern "C" int sum(int x, int y);
int main() {
	sum(100, 200);
	return 0;
}

C:(math.c)

//#include "math.h"  //相当于替换如下
#ifdef __cplusplus
extern "C" {
#endif 
	int sum(int x, int y);

#ifdef __cplusplus
}
#endif 
#include <stdio.h>
int sum(int x, int y) {
	printf("测试C环境\n");
	return x + y;
}

那么显然这两种是不同的。


  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 20:56:54  更:2022-10-22 20:57:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 2:27:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码