深入理解 C 语言中的变量作用域与链接性:externstatic 与全局变量

在 C 语言中,变量的作用域(Scope)和链接性(Linkage)是理解程序结构和模块化的关键概念。本文将详细探讨在函数外定义的变量是否为全局变量、其作用域,以及 externstatic 关键字的作用和区别。


一、函数外定义的变量是全局变量吗?其作用域是什么?

是的,函数外定义的变量被称为“全局变量”(Global Variable)。在 C 语言中,所有在函数外部定义的变量都具有文件作用域(File Scope),即它们在声明之后的整个源文件中都可见,直到文件末尾为止。

示例:

#include <stdio.h>int x = 10; // 全局变量void func() {printf("x = %d\n", x); // 访问全局变量
}int main() {int x = 20; // 局部变量,遮蔽全局变量func();printf("x = %d\n", x); // 访问局部变量return 0;
}

输出:

x = 10
x = 20

func 函数中访问的是全局变量 x,而在 main 函数中访问的是局部变量 x。如果在同一作用域内定义了同名的局部变量,则局部变量会遮蔽全局变量。


二、extern 声明的作用是什么?其作用域是什么?

extern 关键字用于声明一个变量在其他地方定义,告诉编译器该变量在其他源文件中有定义。它本身不分配内存,只是提供一个引用,供链接器在链接阶段解析。

作用:

  • 在当前文件中声明一个在其他文件中定义的全局变量。
  • 使得多个源文件可以共享同一个全局变量。

作用域:

extern 声明的变量的作用域与其定义位置相同,即文件作用域。它在声明之后的整个源文件中可见,直到文件末尾为止。

示例:

文件 file1.c

#include <stdio.h>int x = 10; // 变量定义void func() {printf("x = %d\n", x); // 访问全局变量
}

文件 file2.c

#include <stdio.h>extern int x; // 声明外部变量void func(); // 声明函数int main() {func();printf("x = %d\n", x); // 访问全局变量return 0;
}

编译命令:

gcc file1.c file2.c -o program

输出:

x = 10
x = 10

file2.c 中,使用 extern 声明 x,使得 main 函数能够访问在 file1.c 中定义的全局变量 x


三、extern 声明放在函数内部和外部的区别?

  • 在函数外部: extern 声明用于在当前源文件中引用其他源文件中定义的全局变量。
  • 在函数内部: extern 声明用于在当前函数中引用其他函数或源文件中定义的全局变量。

无论 extern 声明放在函数内部还是外部,作用域都是文件作用域,关键在于它是否在当前源文件中定义了变量。

示例:

#include <stdio.h>extern int x; // 在函数外部声明void func() {extern int x; // 在函数内部声明printf("x = %d\n", x);
}int x = 10; // 变量定义int main() {func();printf("x = %d\n", x);return 0;
}

输出:

x = 10
x = 10

无论 extern 声明放在函数内部还是外部,作用域都是文件作用域,关键在于它是否在当前源文件中定义了变量。


四、externstatic 的区别?

  • extern 表示外部链接,允许在其他源文件中访问变量。
  • static 表示内部链接,限制变量只能在当前源文件中访问,不能被其他源文件引用。

示例:

#include <stdio.h>static int x = 10; // 内部链接void func() {printf("x = %d\n", x); // 访问当前源文件中的变量
}

在其他源文件中,无法通过 extern 声明访问 x,因为它具有内部链接。


五、extern 与函数的关系?

在 C 语言中,函数默认具有外部链接,因此无需使用 extern 声明即可在其他源文件中访问。为了提高代码的可读性和可维护性,通常在头文件中使用 extern 声明函数。

示例:

// header.h
extern void func(); // 声明函数// file1.c
#include "header.h"void func() {printf("Hello from func!\n");
}// file2.c
#include "header.h"int main() {func(); // 调用函数return 0;
}

file2.c 中,通过包含 header.h 头文件,可以调用在 file1.c 中定义的 func 函数。


六、总结

  • 全局变量: 在函数外定义的变量,作用域为文件作用域,生命周期为程序运行期间。
  • extern 声明: 用于在当前源文件中引用其他源文件中定义的全局变量,作用域为文件作用域。
  • static 用于限制变量的作用域为当前源文件,不能被其他源文件引用。
  • 函数: 默认具有外部链接,可以在其他源文件中访问,通常在头文件中声明。

理解这些概念有助于编写结构清晰、模块化的 C 语言程序。如有更多疑问,欢迎继续提问。

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

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

相关文章

实验三 软件黑盒测试

实验三 软件黑盒测试使用测试界的一个古老例子---三角形问题来进行等价类划分。输入三个整数a、b和c分别作为三角形的三条边&#xff0c;通过程序判断由这三条边构成的三角形类型是等边三角形、等腰三角形、一般三角形或非三角形(不能构成一个三角形)。其中要求输入变量&#x…

小米首个推理大模型开源——Xiaomi MiMo,为推理而战!

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、MiMo的惊人表现&#xff1a;小参数量&#xff0c;大能力二、双轮驱动&#…

《2025全球机器学习技术大会:阿里云讲师张玉明深度剖析通义灵码AI程序员》

4 月 18 日 - 19 日&#xff0c;由 CSDN & Boolan 联合举办的 2025 全球机器学习技术大会&#xff08;ML-Summit&#xff09;于上海顺利举行。大会聚焦人工智能与机器学习前沿技术&#xff0c;汇聚了来自科技与人工智能领域的数位顶尖专家以及数千名开发者和研究者&#xf…

MySQL事务隔离级别详解

MySQL事务隔离级别详解 事务隔离级别概述 MySQL支持四种标准的事务隔离级别&#xff0c;它们定义了事务在并发环境下的可见性规则和可能出现的并发问题&#xff1a; READ UNCOMMITTED&#xff08;读未提交&#xff09; • 最低隔离级别 • 事务可以读取其他事务未提交的数据&…

计算机视觉(CV)技术的优势和挑战(本片为InsCode)

计算机视觉&#xff08;CV&#xff09;技术是一种利用计算机和算法来模拟人类视觉实现图像和视频处理的技术。它在各个领域都有着广泛的应用&#xff0c;具有许多优势和挑战。 优势&#xff1a; 自动化&#xff1a;CV 技术可以自动识别、分类、跟踪和分析图像和视频数据&…

Android JIT编译:adb shell cmd package compile选项

Android JIT编译&#xff1a;adb shell cmd package compile选项 例如&#xff1a; adb shell cmd package compile -m speed -f --full 包名 配置参数指令说明&#xff1a; compile [-r COMPILATION_REASON] [-m COMPILER_FILTER] [-p PRIORITY] [-f] [--primary-dex] …

Android Kotlin 项目集成 Firebase Cloud Messaging (FCM) 全攻略

Firebase Cloud Messaging (FCM) 是 Google 提供的跨平台消息推送解决方案。以下是在 Android Kotlin 项目中集成 FCM 的详细步骤。 一、前期准备 1. 创建 Firebase 项目 访问 Firebase 控制台点击"添加项目"&#xff0c;按照向导创建新项目项目创建完成后&#x…

搭建PCDN大节点,服务器该怎么配

搭建P2P大节点时&#xff0c;服务器要怎么配呢&#xff1f;需要综合考虑硬件性能、网络带宽、存储能力、系统架构以及安全性等多个方面&#xff0c;以确保节点能够高效、稳定地运行。 一、硬件配置 CPU&#xff1a;选择高性能的多核处理器&#xff0c;以满足高并发处理需求。核…

(done) 吴恩达版提示词工程 8. 聊天机器人 (聊天格式设计,上下文内容,点餐机器人)

视频&#xff1a;https://www.bilibili.com/video/BV1Z14y1Z7LJ/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 别人的笔记&#xff1a;https://zhuanlan.zhihu.com/p/626966526 8. 聊天机器人&#xff08;Chatbot&#xff09; …

AtCoder Beginner Contest 403(题解ABCDEF)

A - Odd Position Sum #1.奇数数位和 #include<iostream> #include<vector> #include<stdio.h> #include<map> #include<string> #include<algorithm> #include<queue> #include<cstring> #include<stack> #include&l…

【Game】Powerful——Abandoned Ruins(9)

文章目录 1、新增古玩2、机关机制3、探索法宝4、智斗强敌5、地图6、参考 2025 年 1 月迎来的新玩法——荒废遗迹 每周四个宝藏铲&#xff08;老玩法&#xff09;或者两个遗迹线索&#xff08;新玩法&#xff09;&#xff0c;3 个宝藏铲也可以换一个遗迹线索&#xff0c;之前没时…

构建网页版IPFS去中心化网盘

前言&#xff1a;我把它命名为无限网盘 Unlimited network disks&#xff08;ULND&#xff09;&#xff0c;可以实现简单的去中心化存储&#xff0c;其实实现起来并不难&#xff0c;还是依靠强大的IPFS&#xff0c;跟着我一步一步做就可以了。 第一步&#xff1a;准备开发环境…

国标GB28181视频平台EasyGBS在物业视频安防管理服务中的应用方案​

一、方案背景​ 在现代物业服务中&#xff0c;高效的安全管理与便捷的服务运营至关重要。随着科技的不断发展&#xff0c;物业行业对智能化、集成化管理系统的需求日益增长。EasyGBS作为一款基于国标GB28181协议的视频监控平台&#xff0c;具备强大的视频管理与集成能力&#…

[Unity]设置自动打包脚本

背景 我们经常会使用自动打包功能 文件名称: AutoBuild.csusing System.IO; using System.Linq; using UnityEditor; using UnityEngine;public class AutoBuilder {[MenuItem("Build/GetCurrentBuildTarget")]public static void GetCurrentBuildTarget(){Debug.L…

正点原子STM32H743单片机实现ADC多通道检测

目标 使用STM32CubeMX工具&#xff0c;配置ADC相关参数&#xff0c;实现在STM32H743单片机上获取ADC多通道电压值。共14个ADC引脚&#xff0c;ADC2有5个&#xff0c;ADC3有9个&#xff0c;全部设置单通道 ADC引脚 PF3PF4PF5PF10PC0PC2PC3PH2PH3PA3PB0PB1PA4PA5PA6 STM32cube…

深度学习基础(四)——计算量(FLOPs)、参数量(Params)、计算速度(FLOPS/TOPS))

一、计算量FLOPs FLOPs&#xff0c;全称为Floating Point Operations, (s为复数缩写&#xff09;&#xff0c;浮点运算数&#xff0c;指模型完成一次前向传播所需的浮点运算次数&#xff0c;可以理解为计算量&#xff08;模型的时间复杂度&#xff09;&#xff0c;用来衡量算法…

电子秤检测管理系统开发实战:从数据采集到可视化大屏

简介 电子秤作为现代工业生产和商业流通中的核心计量设备,其准确性直接关系到产品质量和交易公平。针对仙贝生产企业的电子秤管理需求,我们开发了一套集电子秤检测信息录入、产品信息管理、实时称重数据采集和后台可视化大屏于一体的综合管理系统。该系统基于Django框架构建…

Cesium添加WMS,WMTS,地形图图,3D Tiles数据

在 Cesium 中&#xff0c;你可以添加 WMS、WMTS、地形图 和 3D Tiles 数据源。以下是详细的实现方法&#xff1a; 1. 添加 WMS 服务 WMS&#xff08;Web Map Service&#xff09;是一种动态地图服务&#xff0c;适用于加载栅格地图图层。 代码示例 const viewer new Cesium…

数据库基本概念:数据库的定义、特点、分类、组成、作用

一&#xff1a;数据库相关概念 1.1 定义 &#xff08;1&#xff09;数据库&#xff1a;存储数据的仓库 &#xff08;2&#xff09;数据库管理系统&#xff1a;模拟和管理数据库的大型软件 &#xff08;3&#xff09;SQL&#xff1a;操作关系型数据库的编程语言&#xff0c;定义…

【项目篇之消息序列化】仿照RabbitMQ模拟实现消息队列

实现消息序列化 为什么不使用JSON来序列化直接使用二进制序列化实现序列化方法toBytes()1&#xff1a; 创建内存缓冲区​​2 &#xff1a;创建对象序列化通道​3&#xff1a;执行序列化操作​4&#xff1a;提取二进制数据&#xff0c;转换成byte[]序列化图示流程&#xff1a;序…