C语言:静态全局变量为什么能在外部访问?

192-C语言刷题31 1.若有宏定义:#define S(a,b) t=a;a=b;b=t由于变量 t 没定义,所以此宏定义是错误的。请问这句话的说法是正确的吗? 答案:错 宏定义不作类型检查 2.在C++中,若有以下定义 int a, b; float x ;,则正确的赋值语句是? A.a=1, b=2; B.b++; C.a=b; D.b=int(x); 答案:A BC都会提示使用了未初始化的局部变量b D会提示使用了未初始化的局部变量x 3.函数外部访问x等于什么? enum string { x1, 阅读详情

我们在学习全局变量的时候,常说全局变量可以在外部访问,只要在外部加上extern关键字声明,即可使用,而如果这个全局变量加上了static关键字修饰,即变成了【静态全局变量】的时候,外部则无法访问了,但很多人在尝试的时候会发现,外部竟然也可以访问,甚至不加extern关键字都能访问到。

原因是:使用了不正确include,并理解错了“外部”的含义。

下面以linux环境举例说明,假设两个文件v1.c和v2.c,v2.c中包含一个全局变量a,v1中使用extern关键字使用这个a,应该写如下代码:

// v1.c
#include <stdio.h>

int main() {
    extern int a;
    printf("extern int a = %d\n", a);

    return 0;
}
// v2.c
#include <stdio.h>

int a = 100;
static int b = 101;

如果在v1.c中写了#include "v2.c",那么v2.c会被当成v1.c的一部分,此时虽不在同一个源文件中,但二者仍像在同一个文件中一样,是不能称为“外部”的。必须像如上这种不存在直接include关系的情形,才能称为“外部”。但以上代码如何编译并运行?此处使用gcc来操作:

gcc -c v1.c v2.c              # 编译产生v1.o v2.o
gcc v1.o v2.o -o vmain        # 将v1.o和v2.o经过链接成可执行文件vmain

./vmain    # 执行vmain

执行后得到结果:

[yancy@localhost test]$ gcc -c v1.c v2.c
[yancy@localhost test]$ gcc v1.c v2.c -o vmain
[yancy@localhost test]$ ./vmain
extern int a = 100
[yancy@localhost test]$ 

以上才是正确的引用外部全局变量的方法。

而用这种方法,在v1.c中引用v2.c中定义的static全局变量:

#include <stdio.h>

int main() {
    extern int a;    // 引用外部的全局变量a
    printf("extern int a = %d\n", a);

    extern int b;    // 试图引用外部的静态全局变量b
    printf("extern int b = %d\n", b);

    return 0;
}

则会在链接环节报错:

[yancy@localhost test]$ gcc -c v1.c v2.c
[yancy@localhost test]$ gcc v1.c v2.c -o vmain
/tmp/ccGRMlxv.o: In function `main':
v1.c:(.text+0x1d): undefined reference to `b'
collect2: error: ld returned 1 exit status
[yancy@localhost test]$ 

这也证实了,static全局变量无法在外部被使用。

这里的【外部】,实际上是【单独编译的模块外部】,就是这里gcc -c形成的.o文件,每一个.o文件是一个单独的模块,所以不能以【源文件】外部为准,是站在编译角度来说的。当初刚学C语言的时候,并不理解编译、链接等内容,导致这个问题一直没懂,希望这里能帮大家解惑。

IEC 61400-1:2019 附录 C 湍流模型全面解读 IEC 61400-1:2019 附录 C 全面解读 阅读详情

相关推荐

Windows本地化部署Dify完整指南

本文详细介绍了在Windows系统上本地化部署Dify的完整步骤,涵盖了Docker Desktop的安装与配置、Dify源代码的获取、环境变量的设置、服务的启动与管理、以及常见问题的解决方案。文章首先指导用户如何下载和安装Docker Desktop,并配置WSL 2功能。接着,详细说明了如何获取Dify源代码,并通过Docker Compose启动服务。文章还提供了高级配置指南,包括如何配置大语言模型和更新Dify版本。最后,针对Docker镜像拉取失败等常见问题,提供了详细的诊断和解决方案。通过本文,

jacky_zhuyuanlu的博客 1万+

函数内定义的static变量怎样在外部访问和修改

可以在外部,定义一个全局指针变量,在定义了static变量的函数内部,将static变量的地址付给指针。多个文件时,用extern声明指针。注意:extern 和 static本身就是对立的关键字,使用extern就是为了不同文件都可使用该变量或者函数.使用static关键字就是为了限制原文件使用,其它文件不可使用.所以extern和static关键字不可同时使用的.小例子:

wm_cindy的专栏 3215

Modelsim10.5_se安装(Win11)

modelsim是Mentor公司开发的优秀的HDL语言仿真软件。它能提供友好的仿真环境,采用单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单一内核仿真技术,编译仿真速度快且编译的代码与平台无关。

m0_51186267的博客 9908

静态变量static和extern外引用

静态变量--加static关键字的变量,特点: (1)在全局数据区中分配内存,每次对其值得修改都会保留结果,直至程序结束。 (2)若静态变量没显示初始化,那会被自动初始化为0,并且只能初始化一遍。 1、全局变量: 有全局作用域,并且有外部链接性,也就是不仅是所在文件,工程内的其他文件也可以用extern来使用同个工程内其他文件里面定义的变量。例如下面的例子: 代码1: #include

1万+

MPU6050芯片 寄存器详解与配置指南(详解)

分频值越小,数据刷新越快(如分频值 = 0 时,刷新率 = 8kHz/1=8kHz)。功能:配置采样频率分频系数,控制 ADC 转换速度和数据刷新率。数据刷新率 = 陀螺仪输出时钟频率 /(1 + 分频值)

m0_74696257的博客 1420

Windows 10/11 安装 HYSPLIT 气象模型全攻略(附必备工具包下载清单)

本文提供了一份详尽的Windows 10/11系统下HYSPLIT气象模型安装与配置全攻略。指南涵盖了从核心认知、必备工具包(Tcl/Tk、ImageMagick)下载,到分步安装、环境变量设置及首次运行验证的完整流程,旨在帮助研究者和学生高效部署这一用于大气轨迹模拟与污染物扩散分析的专业工具。

weixin_28335283的博客 607

6、关于静态内部类调用外部静态变量的字节码解析

静态内部类访问外部静态变量的字节码解析

单俞浩的博客 820

lammps 案例in文件汇总

进阶案例: 聚乙烯和石墨烯界面pull out模拟代码 反应力场reax/c设置方法及案例解析 石墨烯热导率模拟代码(NEMD方法) 圆锥形SiC纳米磨削单晶硅源代码 高熵合金FeNiCrCoCu纳米压痕模拟代码 fix indent命令实现纳米摩擦及摩擦力计算 Fe原子辐照轰击多层石墨烯模拟代码 铝基石墨烯复合物压缩变形in文件源代码 石墨烯自动卷曲到Fe纳米线模拟源代码 铝/石墨烯复合物结晶过程lammps模

lammps_jiayou的博客 9444

c语言怎么引用外部静态变量,C语言里面"具有外部链接的静态变量"这里的"链接"是什么意思...

首先从静态变量说起. C语言里面静态变量有三种: 分别是外部链接性,内部链接性和无链接性.声明外部链接的变量的方法是在代码块外面声明它. 此变量是全局变量,多文件中亦可用.声明内部链接的变量的方法是在代码块外面声明它并加上static限定符. 此变量是全局变量,但仅在本文件中可用.声明无链接的变量的方法是在代码块里面声明它并加上static限定符. 此变量是局部变量,但仅在本代码块中可用.例:#i...

weixin_31968639的博客 1343

lvgl 9虚拟键盘控件 (lv_keyboard) 使用指南

是 LittlevGL 提供的一个虚拟键盘控件,适用于在图形界面中输入文本。与按钮矩阵类似,虚拟键盘预定义了多个键位布局,支持多种模式和自定义键位映射,能够满足各种文本输入需求。通过与文本区域 (Text Area) 的结合,键盘能够自动将输入的字符传送到指定区域。控件是 LittlevGL 提供的强大虚拟键盘解决方案,适用于任何需要文本输入的界面。通过预定义的键盘模式、自定义键位映射和文本区域自动填充功能,可以大大提升用户输入体验。无论是在嵌入式系统的用户界面中,还是在其他需要虚拟键盘的应用中,

m0_62599305的博客 2185

FPGA/IC 秋招笔试/面试题总结(目录)

FPGA/IC 秋招笔试/面试题总结-目录介绍 文章目录FPGA/IC 秋招笔试/面试题总结-目录介绍一、FPGA内部资源1. 什么是FPGA2.FPGA内部资源二、同步时钟、同步/异步电路1.同步时钟2.同步/异步电路三、同步复位/异步复位1.同步复位2. 异步复位3. 异步复位同步释放四、同步FIFO/异步FIFO1.同步FIFO2.异步FIFO五、FIFO最小深度计算1.FIFO最小深度2.示例分析六、逻辑电平1.TTL电平标准2.LVTTL电平标准3.CMOS电平标准4.LVCOMS电平标准5.RS

Crazzy_M的博客 2万+

C语言 变量的存储和引用,内部和外部函数

C语言 变量的存储和引用,内部和外部函数

qq_48516121的博客 2075

19、情境理论中的信息结构解析

本文系统解析了情境理论中的信息结构,从信息元(infon)的基本概念出发,深入探讨了关系结构与简单信息结构的构建方法,分析了标准信息结构所满足的一系列公理(如A1-A14),并阐述了角色、同一性、高阶信息、循环现象、参数适当性及信息元部分性等核心性质。通过具体示例和流程图展示了信息结构的构建过程,并对比了不同公理下的结构差异,最后讨论了该理论在与其他领域融合中的发展趋势及面临的挑战。

book8的博客 78

C语言中关键字static的三种用法

**static**的用法有三种,分别是 **1. 静态局部变量 2. 静态全局变量,3. 静态函数**,下面我们一一介绍 : - 栈区 :存放局部变量,形式变量,临时作用的变量。特点:进入作用于创建,出了作用域销毁(还给操作系统) - 静态区 :存放全局变量,静态变量 。特点 : 创建后,直到程序结束后才销毁(还给操作系统)

tang20030306的博客 1758

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

语言全局变量跨文件_《小白学C》第二章 C语言入门(上)

第二章 C语言入门§2.1 标识符在C语言中味了在程序的运行过程中可以使用变量、常量、函数、数组等,就要为这些形式设定一个名称,而设定的名称就是所谓的标识符。C语言中标识符命名规则如下:标识符由字母、数字、下划线组成,必须以字母或下划线开头。ANSI标准规定,标识符可以为任意长度,但外部名必须仅前8个字符就能唯一地进行区分(因为编译程序IBM PC的MSC仅能识别前8个字符)。标识符区分大小写标识...

weixin_29664739的博客 485

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【我解C语言面试题系列】001 static有什么用途?

【我解C语言面试题系列】001 static有什么用途?【题目】static有什么用途? 在网上流传很广的一个答案是:1、限制变量的作用域2、设置变量的存储域    我觉得这样答题是不妥当的,有点文不对题的感觉。 下面是我给出的答案:static 类型声明符在C语言里面主要有三个用途:1、声明静态局部变量。2、声明静态外部全局变量。3、声明静态外

ammana_babi的专栏 5965

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C语言static关键字用法详解

static关键字修饰局部变量的用法

m0_66434421的博客 261

c语言中的全局变量,局部变量,static,extern

变量可以在程序中三个地方说明: 函数内部、函数的参数定义中或所有的函数外部。根据所定义位置的不同, 变量可分为局部变量、形式参数和全程变量。从空间角度来看,变量可以分为全局变量和局部变量,而从时间角度来分的 可以有静态存储变量和动态存储变量之分。   一。全局变量和局部变量 1。局部变量 他是 指在函数内部定义的变量 作用域为定义局部变量的函数 也就是说他只能在定义他的函数

zhanghui310的专栏 1611

c语言储存类标识符,学习用户标识符的存储类以及作用域

C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。今天小编要给大家分享一篇教程,那就是:学习用户标识符的存储类以及作用域。一、全局变量以及局部变量大家知道全局变量以及局部变量这两者的定义吗?在这里小编就简单的介绍一下吧。在函数内部又或者是复合语句内部定义的变量,我们将其称之为局部变量。函数的形参属于局部变量。在函数外部定义的...

weixin_42297605的博客 330

C语言中的static和extern的区别和用法

两者都是C语言中的关键字,static是静态的意思,可以用来修饰局部变量,修饰全局变量,修饰函数,extern是用来声明外部符号的。

2301_78804510的博客 574

C语言 static和extern

static 和extern 都是C语言中的关键字。

2301_76445610的博客 152

C语言笔试题(10)——static的作用

在C语言中,关键字static有三个明显的作用: 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 简单的来

技术随笔 886

(c语言)static修饰局部变量,全局变量,自定义函数

/注:自定义函数是有外部链接属性的,若没有用static修饰,则可以用extern来声明外部变量。//注:全局变量是有外部链接属性的,若没有用static修饰,则可以用extern来声明外部变量。例:extern int a;//此段代码输出结果为十个2,因为a为局部变量,每次执行自定义函数test时,a都会被重新赋值为1;//(3)static修饰自定义函数时,该函数只在本文件内被访问,不能在其他文件被直接访问。//(2)static修饰全局变量时,该变量只在本文件内被访问,不能在其他文件被直接访问。

2301_79580018的博客 234

C++/c static和匿名命名空间 总结

<br />static:<br />1、函数之外的变量就是全局变量,这个想法正确吗? <br /> 答: 在C中,完全正确。只不过按有没有加static修饰可以分为静态全局变量和一般全局变量两种。 <br /> 2 如果在全局变量的前面加上static 会有什么用? <br /> 答:在C中,静态全局变量意味着两个方面。一、在生命期方面,它与一般全局变量一样,是与整个程序共存亡的;二、在可见性方面,它只在定义它的那个编译单元中可见。比如说,你在test

Monkeycn的专栏 2416

static -- 静态修饰符

摘要:static修饰符在不同场景下作用不同:修饰局部变量可延长其生命周期;修饰全局变量和函数会限制其作用域,使其仅能在当前文件内访问。extern声明则用于访问外部全局变量和函数。static修饰的全局变量和函数将禁止被外部链接访问,从而增强代码的封装性。静态修饰符通过控制变量和函数的存储类型与链接属性,实现了对程序作用域和生命周期的灵活管理。

a88454402的博客 243

C/C++中的static关键字

摘自https://blog.youkuaiyun.com/majianfei1023/article/details/45290467 C 语言的 static 关键字有三种(具体来说是两种)用途: 静态局部变量:用于函数体内部修饰变量,这种变量的生存期长于该函数。 int foo(){ static int i = 1; // note:1 //int i = 1; // note:2 i += 1; return i; } 要明白这个用法,我们首先要了解c/c++的内存分布,以及static所在的区间。 对

遇事不决,问春风 281
上一篇: JSON对象转为Java类对象
下一篇: gcc/g++相关用法罗列
Yancy Piggy
博客等级 码龄14年 27粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值