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语言的时候,并不理解编译、链接等内容,导致这个问题一直没懂,希望这里能帮大家解惑。

TortoiseGit提示No supported authentication methods available错误 一、问题 在使用TortoiseGit与远程仓库进行同步代码的时候提示如下错误,即:没有支持认证的方法可用。而GitBash却可以正常使用,不受影响。 通过调查,发现应该是TortoiseGit远程仓库的公匙无法和本地的密匙进行匹配认证造成的(主要是TortoiseGit缺少本地密匙)。由于TortoiseGit的默认网络SSH client是TortoiseGitPlink.exe,如下图所示。因此主要有两种方式来解决该问题: 不修改TortoiseGit的默认网络SSH client,此时需要为To 阅读详情

相关推荐

RS232/RS485/CAN_BUS 通信原理总结与通信波形分析

分析一:232串口信号要点:RS232,全双工,采用三线制传输分别为TXD\RXD\GND,其中TXD为发送信号,RXD为接收信号。在RS232中任何一条信号线的电压均为负逻辑关系。即:-15v ~ -3v 代表1 +3v ~ +15v 代表0测试结果与分析:如图所示,以传输一个8位二进制数值“01101010”为例,异步传输数据的一般格式为:起始位+校验位+数据位+停止位。其中,校验位为可选项。...

乔木鱼 1万+

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

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

wm_cindy的专栏 3215

退火朗之万动力学采样

退火朗之万动力学采样(Simulated Annealing Langevin Dynamics Sampling)结合了退火技术和朗之万动力学,是一种用于分子模拟和统计物理中的计算方法。这种方法可以帮助系统从局部最小值中逃逸,以找到全局最小值或进行有效的配置空间探索。

weixin_39699362的博客 1947

静态变量static和extern外引用

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

1万+

图像配准方法之灰度信息法

这系列文章是5年前的,也是从自己的QQ(632846506)日志中移过来的。https://user.qzone.qq.com/632846506/infocenter。      图像配准的方法主要有三种:基于灰度信息方法;基于空间变换域方法;基于图像特征的方法。 一、灰度信息法。     灰度信息法直接利用两幅图像之间灰度度量的相似性,以图像内部的信息为依据,采用搜索方法寻找相似度最大或

月秀明竹的专栏 1万+

从412到200:一步步拆解瑞数6代jsvmp的cookie生成与验证流程

本文深入解析瑞数6代JSVMP的动态安全防护机制,详细拆解从412到200状态的cookie生成与验证流程。通过剖析JSVMP虚拟机核心机制、动态元数据解析及环境检测绕过策略,为逆向工程师提供实用的技术解决方案,帮助突破瑞数6代的高级防御体系。

weixin_30342209的博客 508

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

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

单俞浩的博客 820

一文梳理金融风控建模全流程(Python)

。借助A卡模型,银行或金融机构能够根据申请人的个人信息和历史数据,对其进行风险评估。这种评估能够帮助金融机构判断借款人是否具备偿还贷款的能力和意愿。

weixin_43420291的博客 4776

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

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

weixin_31968639的博客 1343

Mininet 2.2.1 图形可视化界面使用注意事项

前言 关于mininet的安装,网上教程不少,大致可以参考以下这篇文章: https://blog.youkuaiyun.com/linyixiao88/article/details/65651390 安装的时候,也可以不必根据上面这篇文章这么麻烦,直接sudo apt-get install mininet,即可。 Mininet可视化 Mininet 2.2.0以上版本内置了...

裕东方的博客 4190

Mac M系列芯片用户必看:UTM虚拟机跑麒麟V10安装达梦DM8全流程避坑指南

本文为Mac M系列芯片用户提供了一份详尽的UTM虚拟机安装麒麟V10并部署达梦数据库DM8的实战指南。文章深入分析了在ARM架构下选择UTM而非其他虚拟化方案的原因,并详细拆解了从系统安装、SPICE工具配置、麒麟V10深度调优到DM8安装与避坑的全流程,重点解决了ARM环境下的兼容性与配置难题,帮助开发者高效搭建国产化开发测试环境。

ss78901的博客 936

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

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

qq_48516121的博客 2075

Unity插件NodeCanvas之行为树的详细教程

NodeCanvas 是一个用于 Unity 的可视化脚本工具,主要用于游戏开发中的行为树、状态机和流程图的设计。它通过节点编辑器的方式,让开发者可以更直观地创建和管理游戏逻辑,减少了传统编码的复杂性。今天我们就来详细介绍一下NodeCanvas插件。

TxNet 1955

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

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

tang20030306的博客 1758

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

weixin_29664739的博客 485

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

ammana_babi的专栏 5965

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

C语言仅在函数中可见,如何学习C语言、入门C语言,看这篇就够了

存储类型C中包含4种存储类型:自动存储类型(auto),寄存器存储类型(register),静态存储类型(static),外部存储类型(extern).1.程序 帮助理解块或函数中变量的作用域#include void function(){// 在函数中声明变量j,因此该变量仅在函数内部可见int j = 100;printf("\n%d",j);}int main(int argc, cons...

weixin_42500279的博客 142
上一篇: 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、付费专栏及课程。

余额充值