【原创_解析】关于static型变量被外部文件修改的问题..

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
简介: 【原创_解析】关于static型变量被外部文件修改的问题..

关于static :

问题再现:

//*********************main.cpp
#include <iostream.h>
#include"main.h"
void fuc();//文件外部函数
void fuc2()
{
   i++;
}
int main(int argc, char *argv[])
{
cout<<"i      "<<i<<endl;
i++;
        cout<<"i++    "<<i<<endl;
fuc2();
cout<<"fuc2   "<<i<<endl;
fuc();
cout<<"fuc    "<<i<<endl;
return 0;
}
//*******************main.h
static int i=1;
//********************fuc.cpp
#pragma once
#include"main.h"
void fuc()
{
i++;
}
//***********************
运行结果
i      1
i++    2
fuc2   3
fuc    3
Press any key to continue
//**********************

如上述文件所示,,在main.h文件中定义个static int i初始化为1

然后在main.cpp里i++输出的结果为2,,,这个没有问题,

第三个调用main.cpp内部定义的函数fuc2让i++输出结果为3,这个也没问题

可是为什么调用文件外部定义的函数fuc时i++却不起作用了呢?????


我们先去看看static:

【百度百科】未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);

 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;

定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:

 静态全局变量不能被其它文件所用;

 其它文件中可以定义相同名字的变量,不会发生冲突

****************************************

根据百度百科的定义,我们来猜想:

   文中说在文件之外是不可见的、、、、可是在fuc.cpp中确实用了啊??。。而且是定义到在头文件中、、等等.......哈哈,这句话我说

错了,,,是【声明】在main.h里面,,,,这就意味着没有定义,,,也就是说没有实际的申请内存空间、、、、这就对了,,,在

main.cpp和fuc.cpp中分别include了main.h文件,,这就意味着编译时分别申请了两块内存,,【注意都是i】而且百度中说静态变量在外部文

件中不可见,,所以这两个i虽然名字相同但内存并不冲突。。。。。

   恩,这个只是个猜想,,,下面我们来验证一下,,,,我们看看这两个cpp文件中的i的内存是不是相同,,如果相同说明是同一个i,,

fuc函数操作的就是同一个i。。。。如果内存不同,说明fuc操作的i和main.cpp中定义的i不是同一个,,,,是新开辟的内存空间,,,,当

然显示出来的main.cpp中的i就不会变化。。。。

验证:【代码我就不再写了,只写出显示结果】

*****************

main.cpp中初始的i的地址   0x0042AD54

main.cpp中初始的i值       1

fuc2操作的i的地址          0x0042AD54

fuc2返回时i的值           2

fuc.cpp中i没有加一前的值   1

fuc.cpp中的i的地址    0x0042AD50

fuc.cpp中的i的值      2

fuc返回main中时i的地址    0x0042AD54

fuc返回main中时i的值      2

Press any key to continue

/***********************

由输出结果可以看出,,,在main.cpp中操作的i的地址都是0x0042AD54。。。可是在fuc.cpp中操作的i的地址都是0x0042AD50。。。这样就验

证了我们的猜想,,,看来是被定义了两次。。。。。

总结:

1.头文件只有声明的作用,而没有定义变量,,也就是没有给变量开辟固定的空间

2.在cpp文件中,如果包含的头文件中有声明为static的变量,,则编译时给此变量开辟空间,,,并且此变量只能在本文件范围内起作用,,

3.其他cpp文件再次包含时,需要再次开辟空间,,,虽然两个变量名一样,,,但是两个变量之间没有影响,,,,


相关文章
|
2月前
|
XML Java 数据格式
java解析xml文件内容
java解析xml文件内容
34 0
|
4天前
|
存储 数据采集 数据可视化
深入解析GPS接收机的位置数据文件:项目实战从数据解析到可视化
全球定位系统(GPS)是现代技术的支柱之一,广泛应用于交通导航、科学研究、智能设备等领域。GPS接收机通过接收来自卫星的信号,确定设备的地理位置,并将这些位置信息记录在数据文件中。 这些数据文件通常包含大量的信息,如时间、位置、海拔高度、卫星状态等。本篇文章将通过解析这些数据文件,展示如何利用Python和Folium库实现数据的读取、处理和可视化,帮助读者深入理解GPS数据的处理过程。
|
14天前
|
监控 数据挖掘 Python
python3解析wav文件获取dtmf值
【8月更文挑战第5天】这段Python代码示例展示了如何解析WAV文件并检测其中的双音多频(DTMF)信号。它首先打开并读取WAV文件的内容,接着利用`numpy`和`scipy`库计算频谱图。通过定义标准的DTMF频率对,并在频谱中寻找这些特定的频率组合,从而识别出DTMF值。此代码可用于电话系统监控或音频数据分析项目中,以自动化检测和处理DTMF信号。
|
1月前
|
存储 分布式计算 DataWorks
MaxCompute产品使用合集之如何在代码中解析File类型的文件内容
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
55 11
|
18天前
|
安全 搜索推荐 数据挖掘
文件解析的终极工具:Apache Tika
文件解析的终极工具:Apache Tika
31 0
|
2月前
|
存储 Java 数据库
Static关键字在Java中的多种用途解析
Static关键字在Java中的多种用途解析
|
1月前
|
文字识别 Java Python
文本,文识08图片保存()上,最方便在于整体生成代码,serivce及实体类,base64编码保存图片文件,调用flask实现内部ocr接口,通过paddleocr识别,解析结果,base64转图片
文本,文识08图片保存()上,最方便在于整体生成代码,serivce及实体类,base64编码保存图片文件,调用flask实现内部ocr接口,通过paddleocr识别,解析结果,base64转图片
|
1月前
|
JavaScript
js 解析lrc文件(歌词)
js 解析lrc文件(歌词)
32 1
|
2月前
|
XML JavaScript Java
解析XML文件的几种方法
解析XML文件的几种方法
|
2月前
|
Java
Java 基础深度解析:变量与常量的声明、赋值与初始化的权威指南
【6月更文挑战第14天】Java编程中的变量和常量是基础关键。声明变量如`int age;`,赋值与初始化可在声明时或后续代码中完成。常量用`final`修饰,如`public static final double PI = 3.14159;`,且只能赋值一次。变量命名应具描述性,常量值设定后尽量不变,注重代码的可读性和可维护性。熟练掌握这些将有助于编写高质量Java程序。
39 4

热门文章

最新文章

推荐镜像

更多