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

详解C语言中的关键词:extern以及它需要注意的事项

extern 是C语言中一个非常重要的关键字,用于声明变量或函数的 外部链接性,即在当前文件中使用另一个文件中定义的变量或函数。以下是 extern 的作用和使用场景:


1. extern 的作用

  • 跨文件访问: extern 告诉编译器,某个变量或函数是在另一个文件中定义的,当前文件只是引用它。注意:函数的声明其实默认就具有extern的默认属性,所以extern主要是对全局变量进行声明。
  • 延迟定义: 在文件中引用了某些全局变量或函数,但不在当前文件中定义它们,而是等待链接阶段找到其定义。

2. 主要使用场景

2.1. 用于变量的外部声明

extern 主要用于跨文件访问全局变量。

例如:

文件1:global.c
#include <stdio.h>int globalVar = 42; // 定义全局变量
文件2:main.c
#include <stdio.h>// 声明外部变量
extern int globalVar;int main() {printf("Value of globalVar: %d\n", globalVar); // 输出 42return 0;
}

解释:

  • main.c 文件中,extern int globalVar; 告诉编译器,globalVar 是在另一个文件中定义的。
  • 链接阶段,编译器会将 globalVar 的引用解析到 global.c 中的定义。

2.2. 用于函数的外部声明

虽然函数声明默认具有外部链接性,但你仍可以显式使用 extern,尽管很少需要这样做。

例如:

extern void someFunction(void); // 明确声明某函数为外部定义

注意: 函数的外部声明通常通过头文件实现,因此实际项目中很少需要手动写 extern


2.3. 控制全局变量的作用域

如果某个变量在一个文件中定义,但希望它仅在该文件中可见(即文件作用域),使用 static 定义;如果希望它能被其他文件访问,则用 extern 声明。

示例:

文件1:file1.c

#include <stdio.h>int sharedVar = 100; // 定义全局变量,供其他文件使用
static int localVar = 200; // 仅限当前文件使用

文件2:file2.c

#include <stdio.h>extern int sharedVar; // 引用 file1.c 中的全局变量int main() {printf("sharedVar: %d\n", sharedVar); // 输出 100// printf("localVar: %d\n", localVar); // 错误:无法访问return 0;
}

解释:

  • sharedVar 可以在其他文件中访问,因为它是全局变量,并且在 file2.c 中用 extern 声明。
  • localVar 是静态变量,仅在 file1.c 中可见,其他文件无法引用。

3. 常见误区

  1. 误以为 extern 是定义变量:

    • extern 只是声明,告诉编译器这个变量在别处定义。
    • 如果在没有定义的情况下使用 extern,会导致链接错误。
  2. 对局部变量使用 extern

    • extern 只能用于全局变量和函数。局部变量本身没有链接性,不能被 extern 声明。

4. 总结

  • 作用: extern 用于声明外部变量或函数,支持跨文件访问。
  • 使用场景:
    • 声明全局变量,避免重复定义。
    • 明确标识函数或变量的外部链接性。
  • 典型模式:extern 声明在头文件中,定义在对应的源文件中。

在现代开发中,extern 的使用更多体现在 变量跨文件访问接口声明通过头文件实现

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

相关文章:

  • 框架程序设计-简答以及论述
  • ce第六次作业
  • 为何页面搜索应避免左模糊和全模糊查询???
  • AI可信论坛亮点:合合信息分享视觉内容安全技术前沿
  • 在 Mac M2 上安装 PyTorch 并启用 MPS 加速的详细教程与性能对比
  • 生成式人工智能在生产型企业中的应用
  • Linux逻辑卷管理
  • 机器人加装电主轴【铣削、钻孔、打磨、去毛刺】更高效
  • opencv sdk for java中提示无stiching模块接口的问题
  • 今天最新早上好问候语精选大全,每天问候,相互牵挂,彼此祝福
  • 五种IO模型- 阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO
  • Vscode GStreamer插件开发环境配置
  • flask基础
  • Java日志框架:log4j、log4j2、logback
  • 鸿蒙-expandSafeArea使用
  • 【es6复习笔记】Spread 扩展运算符(8)
  • 第22天:信息收集-Web应用各语言框架安全组件联动系统数据特征人工分析识别项目
  • 后端-redis
  • 开发场景中Java 集合的最佳选择
  • golangci-lint安装与Goland集成
  • 金仓数据库安装-Kingbase v9-centos
  • 条款6:auto推导若非己愿,使用显式类型初始化惯用法
  • 蓝桥杯物联网开发板硬件组成
  • 视频汇聚融合云平台Liveweb一站式解决视频资源管理痛点
  • (aaai2025) FD2-Net: Frequency-Driven Feature Decomposition Network
  • 深度学习之目标检测——RCNN
  • 2014年IMO第3题
  • 国高材服务 | 高分子结晶动力学表征——高低温热台偏光显微镜
  • 跨站请求伪造之基本介绍
  • Hadoop集群(HDFS集群、YARN集群、MapReduce​计算框架)