c++中的extern关键字
extern关键字主要修饰变量或函数,表示该函数可以跨文件访问,或者表明该变量在其他文件定义,在此处引用。
extern修饰变量
(1)如果某变量int m在a.c中定义声明,则其他b.c文件访问时,需要用extern声明该变量才可以。
注意extern的严格声明,如在一个文件中声明char a[] = "abcd";另一个文件如果访问需声明extern char a[],而不能是extern char *a;
(2)如果在*.h中声明,其他文件使用时,则只需要包含头文件即可,无需再声明,建议只在头文件中声明就好了。
注意:extern可以声明无数次,但只能定义一次,否则会出现链接错误。另外能够被其他模块以extern修饰符引用到的变量通常是全局变量,extern int m可以放在b.c中的任何地方,如果放在代码块内,则b.c中访问m的区域就只能限于代码块内。
(3)如果一个变量声明于代码块内部,在它前面添加extern表示引用的是全局变量而不是局部变量。
extern修饰函数(不用"C"修饰)
extern修饰函数和变量没有区别,只需extern声明后,即可用于该文件中各个位置。对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件,在程序中取代include “*.h”来声明函数。
一般调用方式如下:首先在头文件extern 修饰声明函数,包含该头文件在对应的c文件中实现该函数,C语言中其他文件使用时可以直接调用,也可用extern声明该函数后使用,但C++必须声明后才能使用。建议声明后使用。
使用extern和包含头文件来引用函数有什么区别呢?
extern的引用方式比包含头文件要简洁得多!extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。
extern用于C\C++相互调用
(1)C调用C++
C++头文件中函数前用extern "C"修饰声明,在对应的cpp文件中实现该函数时需注意函数接口不能使用vector或string等C++专有特性,否则C中无法使用
一般调用方式如下:首先在C++头文件extern "C"修饰声明函数,包含该头文件在对应的cpp文件中实现该函数,使用时可以和普通extern声明函数一样使用,在C语言中,只能指定为extern类型,C语言中不支持extern"C"声明。
(2)C++调用C
C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要生成用于链接的中间函数名。
一般调用格式有两种,第一种在c语言头文件中用extern"C"声明:
exte.h
#ifdef __cplusplus
extern "C" {
#endifvoid mytest();#ifdef __cplusplus
}
#endif
exte.c
#include "exte.h"
#include <stdio.h>
void mytest(){printf("%s", "mytest");
}
main.cpp
#include<iostream>
//#include "exte.h"
extern "C" void mytest();//和上面的语句二选一即可,如果函数太多,一般用上面包含头文件的方法
int main(){mytest();system("pause");return 0;
}
第二种是在cpp文件调用时,通过extern"C"包含C语言头文件
exte.h
void mytest();
exte.c
void mytest(){printf("%s", "mytest"); }
main.cpp
#include<iostream>extern "C"{ //和下面的语句二选一即可#include "exte.h"
}//extern "C" void mytest();int main(){mytest();system("pause");return 0;
}
其中第二种,可以去掉include头文件,调用时extern "C" void mytest();即可。
相关文章:
c++中的extern关键字
extern关键字主要修饰变量或函数,表示该函数可以跨文件访问,或者表明该变量在其他文件定义,在此处引用。 extern修饰变量 (1)如果某变量int m在a.c中定义声明,则其他b.c文件访问时,需要用exte…...
javaScript:快乐学习计时器
目录 一.前言 二.计时器 1.计时器的分类 2. 创建计时器的方式 创建间隔计时器 创建方式三种 1.匿名函数 2.使用函数直接作为计时器的执行函数 2.使用函数直接作为计时器的执行函数,用字符串的形式写入 3.计时器的返回值 4.清除计时器 5.延迟计时器 相关代码 一.前言 在…...
onnxruntime 支持的所有后端
1 代码导出 import onnxruntime as ort aaa ort.get_all_providers() print(aaa)1. 1 下面是ort支持的所有后端 TensorrtExecutionProvider, CUDAExecutionProvider, MIGraphXExecutionProvider, ROCMExecutionProvider, OpenVINOExecutionProvider, DnnlExecutionProvider…...
k8s 自身原理 5
我们知道容器是通过 pod 来承载的,我们在 k8s 中,服务都是跑在 pod 里面的,pod 里面可以跑 1 个容器,或者跑多个容器,那么咱们 pod 里面跑 1 个服务容器,咱真的就以为里面就只有这样个容器吗? …...
机器视觉应用开发什么最重要?
(QQ群有答疑)零基础小白快速上手海康VisionMaster开发系列课程 高级语言在机器视觉就是工具,机器视觉软件,在机器视觉中也是工具,在机器视觉应用开发中,图像处理是最重要的,一切看图像ÿ…...
React+Typescript使用接口泛型处理props
好 刚讲完组件 那么 这次 我们来看一下 数据传递的 props 还是上文的案例 例如 我们想将 title 传给Hello组件 之前我们可以直接这样 以一个标签属性的形式传过去 而我们在子组件中 这样去使用 但现在 我们从编辑器中都可以看出 这种写法已经不行了 然后 我们将 hello 组件…...
自定义python文件import导入ModuleNotFoundError: No module named ‘***‘ 问题
自定义python文件import导入ModuleNotFoundError: No module named ‘***’ 问题 错误代码: import configparser import os.path import sys from bin import swk_mysql_create, swk_redis_create这里导入自定义python文件,其中swk_mysql_create.py文…...
Codeforces Round 893 (Div. 2)B题题解
文章目录 [The Walkway](https://codeforces.com/contest/1858/problem/B)问题建模问题分析1.分析所求2.如何快速计算每个商贩被去除后的饼干数量代码 The Walkway 问题建模 给定n个椅子,其中有m个位置存在商贩,在商贩处必须购买饼干吃,每隔…...
HTTP响应状态码大全:从100到511,全面解析HTTP请求的各种情况
文章目录 前言一、认识响应状态码1. 什么是HTTP响应状态码2. Http响应状态码的作用3. 优化和调试HTTP请求的建议 二、1xx 信息响应1. 认识http信息响应2. 常见的信息响应状态码 三、2xx 成功响应1. 认识HTTP成功响应2. 常见的成功响应状态码 四、3xx 重定向1. 认识http重定向2.…...
Vue-10.集成.env
.env、.env.development 和 .env.preview .env、.env.development 和 .env.preview 文件是用于配置环境变量和应用程序设置的文件,它们在项目开发和部署过程中起到关键作用。这些文件用于在不同的环境中设置不同的变量值,以满足不同环境下的配置需求。 …...
强训第33天
选择 C A ping是TCP/IP协议族的一部分,使用ICMP协议,ICMP底层使用IP协议。如果要ping其他网段,则需要设置网关。 如果是二层交换机故障,则ping同网段的也会不通。 C Dos攻击被称之为“拒绝服务攻击”,其目的是使计算机…...
【CTF-web】buuctf-[极客大挑战 2019]EasySQL 1(sql注入)
题目链接 根据题目判断出可能需要sql注入,看源码可知数据是通过GET的方式传输的,即放在url的username和password两个参数中。 只要将username输入为1 or 11#,password可以为任何值,即可顺利登录。 需要注意的是url中的井号表示…...
脚本语言与编译语言的区别
文章目录 一、语法差异二、执行方式差异三、应用领域差异四、总结 一、语法差异 脚本语言:脚本语言通常使用解释器逐行执行,不需要事先编译。它的语法相对简单,易于学习和使用。常见的脚本语言有Python、JavaScript和Ruby等。 编译语言&…...
大型企业或者组织,组建专属的虚拟局域网,深入理解相关的配置和搭建使用、网络加速和网络优化,可夸地区夸国际使用,深入搞懂每项配置的作用和含义
大型企业或者组织,组建专属的虚拟局域网,深入理解相关的配置和搭建使用、网络加速和网络优化,可夸地区夸国际使用,深入搞懂每项配置的作用和含义。 1、openxxx介绍与图解 1.1 openxxx介绍 openxxx 是一个基于 OpenSSL库的应用层 虚拟局域网 实现。和传统 虚拟局域网 相…...
数据结构:二叉树的递归实现(C实现)
个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》 文章目录 前言一、树的概念二、二叉树二叉树的概念二叉树的性质 三、二叉树链式结构实现二叉树节点定义创建二叉树节点遍历二叉树先序遍历二叉树(BinaryTreePrevOrder)中序遍历二叉树(BinaryTree…...
MinGW编译运行报错RTTI symbol not found for class ‘XXX‘
最近在调试程序时莫名的出现图中报错: 还遇到过for class QObject,在此记录一下,排查后发现,原因都是有资源被重复释放导致的。...
table表头颜色 element plus
原图 预期 css :deep(.el-table__header) {background-color: #F5F7FA;} :deep(.el-table tr) {background-color: rgba(0,0,0,0);} :deep(.el-table th.el-table__cell) {background-color: rgba(0,0,0,0);}...
网络安全(自学)
想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全…...
FPGA芯片IO口上下拉电阻的使用
FPGA芯片IO口上下拉电阻的使用 为什么要设置上下拉电阻一、如何设置下拉电阻二、如何设置上拉电阻为什么要设置上下拉电阻 这里以高云FPGA的GW1N-UV2QN48C6/I5来举例,这个芯片的上电默认初始化阶段,引脚是弱上来模式,且模式固定不能通过软件的配置来改变。如下图所示: 上…...
掌握指针进阶:一篇带你玩转函数指针、函数指针数组及指向函数指针数组的指针!!
🍁博客主页:江池俊的博客 💫收录专栏:C语言进阶之路 💡代码仓库:江池俊的代码仓库 🎪我的社区:GeekHub 🎉欢迎大家点赞👍评论📝收藏⭐ 文章目录 一…...
Cursor Pro破解工具:5步实现永久免费使用的终极指南
Cursor Pro破解工具:5步实现永久免费使用的终极指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial…...
打造独特游戏体验:开源资源编辑器的完全指南
打造独特游戏体验:开源资源编辑器的完全指南 【免费下载链接】Harepacker-resurrected All in one .wz file/map editor for MapleStory game files 项目地址: https://gitcode.com/gh_mirrors/ha/Harepacker-resurrected 你是否曾经梦想过为心爱的游戏角色设…...
告别混乱!手把手教你用CCS6.0为DSP28069搭建清晰的工程目录结构
告别混乱!手把手教你用CCS6.0为DSP28069搭建清晰的工程目录结构 在嵌入式开发领域,DSP28069因其强大的实时控制能力而广受欢迎。但许多工程师在使用CCS6.0进行开发时,常常陷入"文件海洋"的困境——找不到关键代码、版本混乱、团队…...
Axure RP中文语言包终极指南:从英文界面到完美汉化的三步解决方案
Axure RP中文语言包终极指南:从英文界面到完美汉化的三步解决方案 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn Ax…...
别再只会用Arduino了!用ESP8266+MicroPython快速搭建你的第一个物联网气象站(附完整代码)
用ESP8266MicroPython打造高性价比物联网气象站 在创客和物联网开发领域,ESP8266凭借其出色的性价比和Wi-Fi功能成为热门选择。而MicroPython则为嵌入式开发带来了Python的简洁与高效,让开发者能够用熟悉的语法快速实现创意。本文将带你从零开始&#x…...
从源码到桌面:手把手教你用Python搭建SimpleFOCStudio开发环境(Windows/Mac)
从源码到桌面:手把手教你用Python搭建SimpleFOCStudio开发环境(Windows/Mac) 在开源硬件和电机控制领域,SimpleFOCStudio已成为开发者调试无刷电机的利器。不同于直接下载可执行文件的"快餐式"使用,从源码构…...
智能合约钱包自动化交互:ca-agent-skills 技能库解析与实践
1. 项目概述与核心价值最近在梳理智能合约钱包(Smart Contract Wallet)的生态工具时,我注意到了 Portkey 团队开源的ca-agent-skills仓库。这个项目乍一看名字有点抽象,但深入研究后,我发现它解决了一个非常实际且关键…...
Awesome-Xamarin快速入门:10分钟掌握最实用的Xamarin开发工具
Awesome-Xamarin快速入门:10分钟掌握最实用的Xamarin开发工具 【免费下载链接】awesome-xamarin A collection of interesting libraries/tools for Xamarin mobile projects 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-xamarin 想要快速提升Xam…...
别再死记硬背了!用“餐厅经营”的比喻,5分钟搞懂批处理、分时和实时操作系统的区别
用餐厅经营智慧解锁操作系统核心概念 想象一下走进一家餐厅,菜单上的选择琳琅满目,服务员穿梭忙碌,厨房里热火朝天——这个看似普通的就餐场景,其实暗藏着计算机操作系统的精妙设计。就像餐厅需要高效协调顾客、服务员和厨师的关系…...
Claudio项目解析:Telegram集成Claude CLI的智能助手部署与成本控制
1. 项目概述:Claudio,一个连接Claude Code与Telegram的智能助手如果你和我一样,日常开发工作流中重度依赖Claude Code CLI,同时又希望能在手机上随时与Claude对话,那么Claudio这个项目绝对值得你花时间研究。它本质上是…...
