当前位置: 首页 > article >正文

理解C语言中的extern关键字

在C语言编程中,extern关键字是一个非常重要的概念,尤其在多文件编程和全局变量的使用中。本文将详细解释extern的作用、用法以及常见的应用场景。


1. extern关键字的作用

extern关键字用于声明一个变量或函数是在其他文件中定义的。它告诉编译器,这个变量或函数的定义不在当前文件中,而是在其他地方(通常是另一个源文件)。通过使用extern,可以在多个文件中共享同一个全局变量或函数。

2. extern的用法

2.1 声明全局变量

假设有两个文件:file1.cfile2.c。希望在file1.c中定义一个全局变量,并在file2.c中使用它。

file1.c:

#include <stdio.h>int globalVar = 10;  // 定义全局变量void printGlobalVar() {printf("GlobalVar in file1: %d\n", globalVar);
}

file2.c:

#include <stdio.h>extern int globalVar;  // 声明全局变量,告诉编译器它在其他文件中定义void printGlobalVar() {printf("GlobalVar in file2: %d\n", globalVar);
}int main() {printGlobalVar();  // 输出全局变量的值return 0;
}

在这个例子中,file2.c通过extern int globalVar;声明了globalVar,表示这个变量在file1.c中定义。这样,file2.c就可以使用globalVar了。

2.2 声明函数

extern关键字也可以用于声明函数。通常情况下,函数的声明默认是extern的,因此不需要显式地使用extern来声明函数。不过,为了代码的清晰性,有时会使用extern来声明函数。

file1.c:

#include <stdio.h>void printMessage() {printf("Hello from file1.c!\n");
}

file2.c:

#include <stdio.h>extern void printMessage();  // 声明函数,告诉编译器它在其他文件中定义int main() {printMessage();  // 调用在file1.c中定义的函数return 0;
}

在这个例子中,file2.c通过extern void printMessage();声明了printMessage函数,表示这个函数在file1.c中定义。

3. extern的常见应用场景

3.1 多文件编程

在多文件编程中,extern关键字非常有用。它允许在一个文件中定义全局变量或函数,并在其他文件中使用它们。这样可以更好地组织代码,避免重复定义。

3.2 共享全局变量

在大型项目中,可能会有多个模块需要共享同一个全局变量。通过使用extern可以在一个模块中定义全局变量,并在其他模块中声明并使用它。

3.3 避免重复定义

使用extern可以避免全局变量的重复定义。如果在多个文件中定义了同一个全局变量,链接器会报错。通过在一个文件中定义变量,并在其他文件中使用extern声明,可以避免这个问题。

4. 注意事项

  • 定义与声明的区别extern关键字用于声明变量或函数,而不是定义它们。定义会分配内存,而声明只是告诉编译器变量或函数的存在。

  • 初始化:在使用extern声明变量时,不能对其进行初始化。初始化只能在定义时进行。

  • 默认的extern:对于函数,默认情况下是extern的,因此通常不需要显式地使用extern来声明函数。

5. 总结

extern关键字在C语言中扮演着重要的角色,尤其是在多文件编程和全局变量的使用中。通过使用extern可以在多个文件中共享变量和函数,避免重复定义,并更好地组织代码。理解extern的用法和注意事项,对于编写高质量的C语言程序至关重要。

相关文章:

理解C语言中的extern关键字

在C语言编程中&#xff0c;extern关键字是一个非常重要的概念&#xff0c;尤其在多文件编程和全局变量的使用中。本文将详细解释extern的作用、用法以及常见的应用场景。 1. extern关键字的作用 extern关键字用于声明一个变量或函数是在其他文件中定义的。它告诉编译器&#x…...

【MyBatis Plus 逻辑删除详解】

文章目录 MyBatis Plus 逻辑删除详解前言什么是逻辑删除&#xff1f;MyBatis Plus 中的逻辑删除1. 添加逻辑删除字段2. 实体类的配置3. 配置 MyBatis Plus4. 使用逻辑删除5. 查询逻辑删除的记录 MyBatis Plus 逻辑删除详解 前言 MyBatis Plus 是一个强大的持久化框架&#xf…...

latex问题汇总

latex问题汇总 环境问题1 环境 texlive2024 TeXstudio 4.8.6 (git 4.8.6) 问题1 编译过程有如下错 ! Misplaced alignment tab character &. l.173 International Conference on Infrared &Millimeter Waves, 2004: 667--... I cant figure out why you would wa…...

基于Redis实现限流

限流尽可能在满足需求的情况下越简单越好&#xff01; 1、基于Redsi的increment方法实现固定窗口限流 Redis的increment方法保证并发线程安全窗口尽可能越小越好(太大可能某一小段时间就打满请求剩下的都拿不到令牌了)这个原理其实就是用当前时间戳然后除窗口大小 在这个窗口大…...

力扣练习之确定两个字符串是否接近

目录 题目&#xff1a; 题解&#xff1a; 详细题解 题目&#xff1a; 如果可以使用以下操作从一个字符串得到另一个字符串&#xff0c;则认为两个字符串 接近 &#xff1a; 操作 1&#xff1a;交换任意两个 现有 字符。 例如&#xff0c;abcde -> aecdb 操作 2&#xff1…...

大三下找C++开发实习的感受分享

目录 找实习的过程 阶段一&#xff1a;投简历 阶段二&#xff1a;准备面试 阶段三&#xff1a;面试中 阶段四&#xff1a;面试结束后 面试真题 总结 找实习的过程 阶段一&#xff1a;投简历 第一次找实习还是使用BOSS这个软件进行投简历&#xff0c;这个过程其实挺难说…...

基于hive的电信离线用户的行为分析系统

标题:基于hive的电信离线用户的行为分析系统 内容:1.摘要 随着电信行业的快速发展&#xff0c;用户行为数据呈现出海量、复杂的特点。为了深入了解用户行为模式&#xff0c;提升电信服务质量和精准营销能力&#xff0c;本研究旨在构建基于 Hive 的电信离线用户行为分析系统。通…...

Makefile——make工具编译STM32工程

一、Makefile相关指令 1.1、变量 符号含义替换追加:恒等于 1.2、隐含规则 符号含义%.o任意的.o文件*.o所有的.o文件 1.3、通配符 符号含义$^所有依赖文件$所有目标文件$<所有依赖文件的第一个文件 1.4、编译器指令常用参数功能说明 符号含义举例-E预处理&#xff0c;…...

Java EE 进阶:SpringBoot 配置⽂件

什么是配置文件 “配置文件”是一个用来保护程序或者系统设置信息的文件&#xff0c;它的作用是让程序在启动或者运行中&#xff0c;能够读取这些设置并按预期进行工作&#xff0c;而不需要手动的设置。 Spring Boot 配置文件 设置服务器端口、编码格式配置数据库连接控制日…...

【redis】五种数据类型和编码方式

文章目录 五种数据类型编码方式stringhashlistsetzset查询内部编码 五种数据类型 字符串&#xff1a;Java 中的 String哈希&#xff1a;Java 中的 HashMap列表&#xff1a;Java 中的 List集合&#xff1a;Java 中的 Set有序集合&#xff1a;除了存 member 之外&#xff0c;还有…...

基于Python的电商销售数据分析与可视化系统实

一、系统架构设计 1.1系统流程图 #mermaid-svg-Pdo9oZWrVHNuOoTT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Pdo9oZWrVHNuOoTT .error-icon{fill:#552222;}#mermaid-svg-Pdo9oZWrVHNuOoTT .error-text{fill:#5…...

色板在数据可视化中的创新应用

色板在数据可视化中的创新应用&#xff1a;基于色彩感知理论的优化实践 引言 在数据可视化领域&#xff0c;色彩编码系统的设计已成为决定信息传递效能的核心要素。根据《Nature》期刊2024年发布的视觉认知研究&#xff0c;人类大脑对色彩的识别速度比形状快40%&#xff0c;色…...

EB-Cable许可管理中的数据安全与隐私保护

在数字化时代&#xff0c;数据安全与隐私保护已成为企业关注的重中之重。作为专业的电缆管理软件&#xff0c;EB-Cable许可管理不仅在功能丰富和操作便捷方面表现出色&#xff0c;更在数据安全与隐私保护方面为用户提供了坚实的保障。本文将详细介绍EB-Cable许可管理在数据安全…...

解决ubuntu(jetpack)系统下系统盘存储不够的

以下是可以安全清理的内容及操作步骤&#xff0c;按优先级和风险从低到高排序&#xff1a; 1. 清理日志文件&#xff08;低风险&#xff09; /var/log/syslog (7.1G) # 清空syslog文件&#xff08;不删除文件本身&#xff09; sudo truncate -s 0 /var/log/syslog# 或限制sys…...

【无人机路径规划】基于麻雀搜索算法(SSA)的无人机路径规划(Matlab)

效果一览 代码获取私信博主基于麻雀搜索算法&#xff08;SSA&#xff09;的无人机路径规划&#xff08;Matlab&#xff09; 一、算法背景与核心思想 麻雀搜索算法&#xff08;Sparrow Search Algorithm, SSA&#xff09;是一种受麻雀群体觅食行为启发的元启发式算法&#xff0…...

STM32_GPIO系统外设学习

按照STM32MCUWIKI、参考手册的外设介绍----->CubeF4的软件包中相关的Exmple代码----->CubeMX设置截图加深理解记忆 资料链接&#xff1a;嵌入式开发_硬软件的环境搭建 我的飞书文档-GPIO篇 如果觉得内容不错&#xff0c;欢迎给我的飞书文档点赞。同时如果有什么意见或…...

使用Java爬虫根据关键词获取衣联网商品列表:实战指南

在电商领域&#xff0c;通过关键词搜索商品并获取商品列表是常见的需求。衣联网作为知名的电商平台&#xff0c;提供了丰富的服装商品资源。本文将详细介绍如何使用Java编写爬虫程序&#xff0c;根据关键词获取衣联网商品列表&#xff0c;并确保爬虫行为符合平台规范。 一、环…...

【操作系统安全】任务1:操作系统部署

目录 一、VMware Workstation Pro 17 部署 二、VMware Workstation 联网方式 三、VMware 虚拟机安装流程 四、操作系统介绍 五、Kali 操作系统安装 六、Windows 系统安装 七、Windows 系统网络配置 八、Linux 网络配置 CSDN 原创主页&#xff1a;不羁https://blog.csd…...

下载安装启动 VMware 个人免费版本

一、进入官网并登录账号下载软件 进入官网 [ https://www.vmware.com ]&#xff0c;点击Products&#xff0c;将页面划到最底下&#xff0c;点击 “SEE DESKTOP HYPERVISORS”按钮。 然后点击 Desktop hypevisor &#xff0c;会出现如下界面&#xff0c;可以根据自己的操作系…...

C#+AForge 实现视频录制

C#AForge 实现视频录制 ​ 在C#中&#xff0c;使用AForge 库实现视频录制功能是一个比较直接的过程。AForge 是一个开源的.NET框架&#xff0c;提供了许多用于处理图像和视频的类库。 开发步骤 安装AForge库 ​ 首先&#xff0c;确保你的项目中已经安装了 AForge.Video和AFo…...

doris:外表统计信息

外表统计信息的收集方式和收集内容与内表基本一致&#xff0c;目前支持对 Hive&#xff0c;Iceberg 和 Hudi 等外部表的收集。 自 2.0.3 版本之后&#xff0c;Hive 外表支持了自动和采样收集。 注意事项​ HMS 类型的 Iceberg 和 Hudi 外表&#xff0c;以及 JDBC 外表只支持手…...

SAP SD学习笔记31 - 销售BOM

上一篇讲 前受金处理(预付款处理)。 SAP SD学习笔记29 - 前受金处理(预收款处理)_fplt 付款申请与sd 数据表的关联关系-CSDN博客 本章继续讲SAP SD模块的其他知识&#xff1a;销售BOM。 销售BOM在现场还是会用到的。 目录 1&#xff0c;销售BOM概要 2&#xff0c;受注BOM的…...

大数据学习(63)- Zookeeper详解

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91e; &#x1f…...

嵌入式八股C语言---面向对象篇

面向对象与面向过程 面向过程 就是把整个业务逻辑分成多个步骤,每步或每一个功能都可以使用一个函数来实现面向对象 对象是类的实例化,此时一个类就内部有属性和相应的方法 封装 在C语言里实现封装就是实现一个结构体,里面包括的成员变量和函数指针,然后在构造函数中,为结构体…...

Android UI性能优化

Android UI性能优化 一、UI性能优化基础 1.1 UI渲染原理 Android系统的UI渲染是通过一个被称为"UI线程"或"主线程"的单线程模型来完成的。系统会以16ms(约60fps)的固定时间间隔发送VSYNC信号,触发UI的渲染流程。如果一帧的处理时间超过16ms,就会出现丢…...

C# ListView设置标题头背景颜色和字体颜色

一、向ListView 添加数据 for (int i 1; i < 5; i) {ListViewItem litem new ListViewItem("data:"i);lv_WarnList.Items.Add(litem); }如果需要在ListView中绑定实体类对象的话&#xff0c;需要将数据放在Tag属性里 for (int i 1; i < 5; i) {AngleData …...

数字统计(信息学奥赛一本通-1096)

【题目描述】 请统计某个给定范围[L, R]的所有整数中&#xff0c;数字2出现的次数。比如给定范围[2, 22]&#xff0c;数字2在数2中出现了1次&#xff0c;在数12中出现1次&#xff0c;在数20中出现1次&#xff0c;在数21中出现1次&#xff0c;在数22中出现2次&#xff0c;所以数…...

嵌入式 ARM Linux 系统构成(6):应用层(Application Layer)

目录 一、应用层概述 二、应用层的核心组成 2.1 主应用程序&#xff08;Main Applications&#xff09; 2.2 系统服务&#xff08;System Services&#xff09; 2.3 用户界面&#xff08;User Interface&#xff09; 2.4 脚本与自动化工具 2.5 第三方库与框架 2.6 通信…...

【HTML】一、基础标签

文章目录 1、开发环境准备2、html介绍3、html基本骨架4、标签的关系5、常用标签5.1 标题5.2 段落5.3 换行与水平线5.4 文本格式化标签5.5 图像标签5.6 超链接标签5.7 音频标签5.8 视频标签 6、路径7、网页制作 1、开发环境准备 在编辑器中写代码&#xff0c;在浏览器中看效果 …...

区块链与去中心化技术

区块链与去中心化技术 核心进展 区块链从加密货币&#xff08;如比特币&#xff09;扩展至智能合约和供应链管理。以太坊2.0引入分片技术提升交易吞吐量&#xff0c;而零知识证明&#xff08;ZKP&#xff09;增强了隐私保护15。企业级应用如IBM的Food Trust平台通过区块链追踪…...