【原创_解析】关于static型变量被外部文件修改的问题..
来源:互联网 发布:java数据访问层框架 编辑:程序博客网 时间:2024/06/06 11:36
在我的上一篇帖子中,我遇到了static在头文件中声明,,但不能为外部文件所修改的问题
【参见http://www.rupeng.com/forum/thread-11904-1-1.html】
经多方面的思考,,现解答如下【请指点】
关于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文件再次包含时,需要再次开辟空间,,,虽然两个变量名一样,,,但是两个变量之间没有影响,,,,
【参见http://www.rupeng.com/forum/thread-11904-1-1.html
经多方面的思考,,现解答如下【请指点】
关于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文件再次包含时,需要再次开辟空间,,,虽然两个变量名一样,,,但是两个变量之间没有影响,,,,
- 【原创_解析】关于static型变量被外部文件修改的问题..
- C++ static变量出现 无法解析的外部符号:public: static 的问题
- 函数内定义的static变量怎样在外部访问和修改
- 类的static变量 连接时,提示无法解析的外部符号
- static变量的问题
- 变量的存储类型、外部变量、static内部变量讲解
- 静态变量 static的解析
- 对static变量的解析
- Java_反射_修改final static问题
- 局部变量,外部变量,static局部变量,static外部变量
- 有关extern关键字/引用外部文件的变量问题
- 关于全局、static对象/变量的初始化问题
- 一个关于VC++无法解析的外部符号的问题
- 关于无法解析的外部符号 的错误问题 socket
- 关于 error LNK2001: 无法解析的外部符号 ___wargv问题
- static在头文件中定义变量的问题
- 关于Android中静态变量static被回收问题
- 关于Android中静态变量static被回收问题
- 数学的用途:色情图片识别
- 关于“服务器提交了协议冲突. Section=ResponseStatusLine"问题请
- 字符串拷贝和内存拷贝函数
- 针对Excel表格文件操作的编程实现
- mac下输出apk时的关于zipalign错误的解决方法
- 【原创_解析】关于static型变量被外部文件修改的问题..
- 【纠结】全局变量啊!!!!!!
- 怎么区分 const 与 * 的组合
- char *p=\"1234\" ; 内存分配
- poj-1258-Agri-Net
- 由一道道题想到的(sizeof)
- 控制按键的 几种方法
- 【转】Lib静态链接库和Dll动态链接库
- 从零开始教你用C语言编游戏【如鹏】