嵌入式c extern的用法

        

目录

一、extern关键字的作用

二、使用示例

三、注意事项

四、总结


在嵌入式编程中,特别是在使用C语言进行STM32等嵌入式系统的开发时,extern关键字是一个非常重要的概念。它主要用于声明外部变量或函数,告诉编译器这些变量或函数的定义在其他的源文件中,而不是当前文件。以下是关于extern用法的详细说明和示例。

一、extern关键字的作用

  • 声明外部变量:extern关键字用于声明一个变量已经在其他文件中定义过,这样编译器就不会在当前文件中为该变量分配内存空间,而是直接引用该变量。
  • 声明外部函数:extern关键字也可以用于声明一个函数已经在其他文件中定义过,这样编译器就知道这个函数是存在的,并可以在当前文件中调用它。

二、使用示例

1. 声明外部变量

假设我们在一个名为file1.c的文件中定义了一个全局变量global_var

// file1.c
int global_var = 10;

然后,在另一个名为file2.c的文件中,我们可以使用extern关键字来声明并使用这个变量:

// file2.c
#include <stdio.h>
extern int global_var; // 声明全局变量
int main() {
printf("%d\n", global_var); // 使用全局变量
return 0;
}

2. 声明外部函数

假设我们在file1.c文件中定义了一个函数add

// file1.c
int add(int a, int b) {
return a + b;
}

file2.c文件中,我们可以使用extern关键字来声明并使用这个函数:

// file2.c
#include <stdio.h>
extern int add(int a, int b); // 声明函数
int main() {
int result = add(1, 2); // 使用函数
printf("%d\n", result);
return 0;
}

三、注意事项

  1. 多次声明,一次定义:对于使用extern声明的变量或函数,可以在多个文件中进行声明,但只能在一个文件中进行定义。
  2. 头文件的使用:如果一个全局变量或函数需要在多个文件中使用,通常建议将其定义放在一个头文件中,并在其他需要使用的文件中包含这个头文件。
  3. C++中的extern "C":在C++中,由于C++支持函数重载,所以编译器会对函数名进行修饰(也称为“名字修饰”或“名字改编”)。为了能够在C++中正确地调用C语言编写的函数,可以使用extern "C"来告诉编译器按照C语言的规则来处理这些函数。

四、总结

   extern关键字在嵌入式编程中扮演着重要的角色,它允许我们在不同的源文件之间共享变量和函数。通过正确地使用extern,我们可以提高代码的可读性和可维护性,同时也能够降低内存的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/24865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑下载速度很慢怎么解决 电脑下载加速工具测评推荐

电脑下载速度慢&#xff0c;不仅耗时冗长&#xff0c;还会影响工作和学习效率。漫长的等待让人心情焦虑&#xff0c;每一秒都是对耐心的极大考验。有关电脑下载速度很慢怎么解决&#xff0c;电脑下载加速工具评测推荐的问题&#xff0c;本文将进行详细介绍。 一、电脑下载速度…

IO进程线程(七)代码替换函数、守护进程

文章目录 一、代码替换函数&#xff08;一&#xff09;system函数&#xff08;二&#xff09;exec函数族 二、守护进程&#xff08;一&#xff09;创建1. 脱离父进程影响2. 脱离原会话组和进程组的影响3.修改进程工作目录4. 修改进程创建文件的掩码5. 关闭从父进程继承的文件描…

将stanfordcorenlp的tokenizer换成自定义的(或用stanfordcorenlp对自定义tokenizer分词后的结果做ner)

本文是基于中文语料做的&#xff0c;对于英文语料应该也是同理&#xff0c;即同样适用的。 分析stanfordcorenlp的分词结果&#xff0c;可以发现&#xff0c;它好像是对最小的中文词进行分词&#xff0c;即其对中文的分词粒度很小&#xff0c;这对于某些nlp场景可能就不太合适…

每日一练——相同分数的最大操作数目

3038. 相同分数的最大操作数目 I - 力扣&#xff08;LeetCode&#xff09;相同分数的最大操作数目 I3038. 相同分数的最大操作数目 I - 力扣&#xff08;LeetCode&#xff09; 第一版 int maxOperations(int* nums, int numsSize) {if(numsSize < 1)return 0;int temp 0;…

内存管理--4.用幻灯片讲解内存分配器Allocator

用幻灯片讲解内存分配器Allocators Allocators 内存分配器 提供内存分配策略的通用接口委托给 C 运行时&#xff1a;new / delete使用块内存池管理内存使用不同大小的块内存池管理内存 为什么用分配器? 将容器逻辑与内存分配策略解耦速度&#xff1a;内存分配速度慢确保…

嵌入式学习——Linux高级编程复习(文件IO)——day37

1. 文件IO——&#xff08;无缓存、文件描述符&#xff09; 1.1 定义 文件IO是指文件输入/输出&#xff0c;是计算机程序中用于读取和写入文件的操作。通过文件IO&#xff0c;程序可以从文件中读取数据到内存中&#xff0c;或者将内存中的数据写入文件中&#xff0c;文件可以是…

Python3 笔记:字符串的 startswith() 和 endswith()

1、startswith() 方法用于检查字符串是否是以指定子字符串开头&#xff0c;如果是则返回 True&#xff0c;否则返回 False。如果参数 beg 和 end 指定了值&#xff0c;则在指定范围内检查。 语法&#xff1a;str.startswith(substr, beg0,endlen(string)) 参数&#xff1a; s…

华为OD技术面试-最长回文串-2024手撕代码真题

题目:最长回文串 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的 回文串 的长度。 在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s = "abccccdd" 输出:7 解释: 我们可以构造的最…

基于51单片机水塔水位控制系统

基于51单片机水塔水位控制 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.用滑动变阻器模拟水位&#xff0c;ADC0809将模拟信号转换为数字信号&#xff1b; 2.LCD1602显示当前水位和水位阈值&#xff1b; 3.当水位超过设定阈值&#xff…

MySQL基础_10.约束

文章目录 第一章、约束1.1 约束的定义1.2 非空约束1.3 唯一性约束1.4 主键约束1.5 自增列1.6 外键约束1.7 CHECK约束1.8 DEFAULT约束 第一章、约束 1.1 约束的定义 约束是对表中字段的限制。 约束按照作用范围可以分为&#xff1a;列级约束和表级约束 列级约束&#xff1a;声…

【二进制部署k8s-1.29.4】十二、ingress-nginx的安装部署

文章目录 简介 一.ingress的安装一.验证安装 简介 本章节主要讲解安装ingress-nginx-v1.10.1的安装&#xff0c;ingress的安装比较简单&#xff0c;只需要下载yaml文件&#xff0c;修改一下镜像地址&#xff0c;原本的镜像地址由于墙的原因&#xff0c;没法直接下载&#xff0c…

C++网络编程——多路IO复用 重点epoll

前言补充 阻塞与非阻塞 同步阻塞IO &#xff08;Blocking IO) : 传统IO模型 同步非阻塞IO &#xff08;Non-blocking IO)&#xff1a; 默认创建的socket都是阻塞的&#xff0c;若是要设置成非阻塞IO需要socket被设置成NONBLOCK。 IO多路复用&#xff08;IO Multiplexing&…

微软 Windows 10 22H2 发布可选更新 19045.4474,修复窗口显示问题等

微软今天面向 Windows 10 22H2 版本&#xff0c;发布了 KB5037849 非安全可选更新&#xff0c;用户安装后版本号升至 Build 19045.4474。 IT之家 5 月 30 日消息&#xff0c;微软今天面向 Windows 10 22H2 版本&#xff0c;发布了 KB5037849 非安全可选更新&#xff0c;用户安…

内部资料13000+变现资源,写作副业项目,找灵感就用它!

很多刚学在公众号&#xff0c;或是在其他自媒体平台写副业项目的朋友&#xff0c;写一段时间后会发现找不到写的内容。于是&#xff0c;每天都会为写什么而苦恼&#xff0c;找不到素材&#xff0c;没有灵感。 关注富哥资源站的朋友都知道&#xff0c;咱们的资源站已经更新了内…

2024 Jiangsu Collegiate Programming Contest E. Divide 题解 主席树

Divide 题目描述 Given an integer sequence a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1​,a2​,…,an​ of length n n n. For an interval a l , … , a r a_l,\ldots,a_r al​,…,ar​ in this sequence, a Reduce operation divides the maximum value of the inter…

【NI国产替代】产线测试:数字万用表(DMM),功率分析仪,支持定制

数字万用表&#xff08;DMM&#xff09; • 6 位数字表显示 • 24 位分辨率 • 5S/s-250KS/s 采样率 • 电源和数字 I/O 均采用隔离抗噪技术 • 电压、电流、电阻、电感、电容的高精度测量 • 二极管/三极管测试 功率分析仪 0.8V-14V 的可调输出电压&#xff0c;最大连…

[Cloud Networking] Layer Protocol (continue)

文章目录 1. STP / RSTP / MSTP Protocol1.1 STP的作用1.2 STP 生成树算法的三个步骤1.3 STP缺点 2. ARP Protocol3. DHCP Protocol3.1 DHCP 三种分配方式3.2 DHCP 攻击 4. IPSEC / MACSEC 1. STP / RSTP / MSTP Protocol 1.1 STP的作用 消除二层环路&#xff1a;通过阻断冗余…

shell脚本基础教程

快捷目录 1、解释器2、shell脚本调用方式3、变量自定义变量环境变量特殊变量变量的默认值declare 命令readonly命令let命令 4、数据类型字符串 5、字符串操作6、数组定义数组读取数组修改数组删除数组获取数组长度 7、运算符算术运算符关系运算符布尔运算符逻辑运算符 要在[[ ]…

求极差(range)

题目描述 小红拿到了一个数组&#xff0c;其中每个元素都是素数。小红准备进行若干次以下操作&#xff1a; 选择两个素数元素&#xff0c;将他们合并&#xff0c;生成的新元素为原来两个素数的乘积。 现在小红希望操作到不能再操作为止&#xff0c;然后使得最终的极差&#…

王道408数据结构CH4_串

概述 4 串 4.1 串的实现 4.1.1 存储结构 定长顺序存储 #define Maxsize 255typedef struct{char *ch[Maxsize];int length; }SString;堆分配存储 typedef struct{char *ch;int length; }HString;块链存储 4.1.2 基本操作 4.2 模式匹配&#xff08;子串定位&#xff09; 4.2.…