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

【C语言】extern 关键字

在这里插入图片描述

在C语言中,extern关键字用于声明一个变量或函数是定义在另一个文件中的。它使得在多个文件之间共享变量或函数成为可能。extern关键字常见于大型项目中,通常用于声明全局变量或函数,这些变量或函数的定义位于其他文件中。

基本用法

  1. 变量声明
// file1.c
int shared_variable = 10; // 定义变量// file2.c
extern int shared_variable; // 声明变量int main() {printf("%d\n", shared_variable); // 使用变量return 0;
}

在这个例子中,shared_variablefile1.c中定义,并在file2.c中使用extern进行声明,从而可以在file2.c中访问shared_variable

  1. 函数声明
// file1.c
void shared_function() {printf("This is a shared function.\n");
}// file2.c
extern void shared_function(); // 声明函数int main() {shared_function(); // 调用函数return 0;
}

在这个例子中,shared_functionfile1.c中定义,并在file2.c中使用extern进行声明,从而可以在file2.c中调用shared_function

多文件编程

使用extern关键字时,通常会将变量和函数的声明放在头文件(.h文件)中,然后在需要使用这些变量或函数的源文件(.c文件)中包含相应的头文件。

头文件:shared.h

#ifndef SHARED_H
#define SHARED_Hextern int shared_variable;
extern void shared_function();#endif // SHARED_H

源文件:file1.c

#include "shared.h"int shared_variable = 10;void shared_function() {printf("This is a shared function.\n");
}

源文件:file2.c

#include <stdio.h>
#include "shared.h"int main() {printf("Shared variable: %d\n", shared_variable);shared_function();return 0;
}

在这个示例中,shared.h头文件包含变量和函数的声明。file1.c中定义了这些变量和函数,而file2.c通过包含shared.h头文件来访问和使用它们。

注意事项

  • 多次定义问题:虽然extern关键字允许在多个文件中声明同一个变量或函数,但它们只能在一个文件中定义。如果在多个文件中定义同一个变量或函数,会导致链接错误。

  • 链接阶段处理extern关键字的工作机制在于链接阶段,而不是编译阶段。编译器在编译每个源文件时不会检查extern变量或函数是否已经定义,而是由链接器在链接阶段进行检查。

  • 作用域与存储类extern关键字通常用于全局变量和函数,而不用于局部变量。它的作用域是整个程序,而不仅限于某个文件或函数。

通过使用extern关键字,可以将程序的不同部分分散到多个源文件中,使代码结构更加清晰、模块化,有助于代码的维护和重用。

http://www.lryc.cn/news/389940.html

相关文章:

  • Linux--V4L2应用程序开发(二)改变亮度
  • [Gstreamer] 消息处理handler的设置
  • 线性代数笔记
  • 未公开 GeoServer开源服务器wfs远程命令执行漏洞 已复现(CVE-2024-36401)
  • 【WebGIS干货分享】Webgis 面试题-浙江中海达
  • ES 修改索引字段类型
  • 恢复的实现技术-日志和数据转储
  • 全网最全最细的jmeter接口测试教程,建议收藏
  • Raspbian命令行连接WiFi网络
  • 王佩丰 Excel 基础二十四讲——目录
  • Qt扫盲-QRect矩形描述类
  • Android系统adb shell怎么执行checksum 来判断文件是否变更?
  • JS中的上下文
  • 【深度学习】注意力机制
  • 安卓开发自定义时间日期显示组件
  • IT行业入门,如何假期逆袭,实现抢跑
  • Pyramid 中混合认证策略
  • 深度学习经典检测方法概述
  • <sa8650>sa8650 qcxserver-之-摄像头传感器VB56G4A驱动开发<1>
  • 推荐8款超实用的ComfyUI绘画插件,帮助我们的AI绘画质量和效率提升几个档次!
  • MATLAB-振动问题:两自由度耦合系统自由振动
  • 人工智能-NLP简单知识汇总01
  • Spring Boot中的异步编程技巧
  • 深度解密Spark性能优化之道
  • 在U盘/移动硬盘上安装热插拔式Ubuntu系统,并将Docker目录挂载到NTFS硬盘
  • 商城小程序论文(设计)开题报告
  • 15. Java的 CAS 操作原理
  • 修改element-ui日期下拉框datetimePicker的背景色样式
  • Linux—— 逻辑运算符,压缩和解压缩
  • 音视频入门基础:H.264专题(6)——FFmpeg源码:从H.264码流中提取NALU Header、EBSP、RBSP和SODB