C++ static全局变量与全局变量的区别/static全局函数与全局函数的区别
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
以下举例说明:
1.创建一个名为StaticGlobal的win32 console c++工程
2.在工程里面添加文件A.cpp, 复制以下代码到A.cpp
static int i = ;
static void Func()
{
cout<<i<<endl;
} void FuncA()
{
Func();
} int iG = ;
void FuncG()
{
}
3.在工程里面添加文件B.cpp, 复制以下代码到B.cpp
static int i = ;
static void Func()
{
cout<<i<<endl;
} void FuncB()
{
Func();
} int iG = ;
void FuncG()
{
}
4.复制以下代码到StaticGlobal.cpp
void Func();
void FuncA();
void FuncB(); int _tmain(int argc, _TCHAR* argv[])
{
Func();
FuncA();
FuncB();
return ;
}
5.Build工程,将得到以下Linker errors
1>B.obj : error LNK2005: "void __cdecl FuncG(void)" (?FuncG@@YAXXZ) already defined in A.obj
1>B.obj : error LNK2005: "int iG" (?iG@@3HA) already defined in A.obj
1>StaticGlobal.obj : error LNK2019: unresolved external symbol "void __cdecl Func(void)" (?Func@@YAXXZ) referenced in function _wmain
第1个error是因为FuncG是一个全局函数,在整个程序中都可见,A.cpp里面已经定义了FuncG,B.cpp里面重复定义引起冲突。
第2个error是因为iG是一个全局变量,在整个程序中都可见,A.cpp里面已经定义了iG,B.cpp里面重复定义引起冲突。
第3个error是因为Func是静态全局函数,其只在定义它的文件中有效即A.cpp和B.Cpp,在StaticGlobal.cpp中不可见。
6.注释掉以上错误代码,build通过运行结果如下:
C++ static全局变量与全局变量的区别/static全局函数与全局函数的区别的更多相关文章
- IOS 成员变量,全局变量,局部变量定义,static与extern的区别
IOS 成员变量,全局变量,局部变量定义,static与extern的区别 1,先说定义 1)成员变量定义:生存与该类的生命周期,变量存活周期跟你定义的该类实体对象一样:作用域是整个实体对象:可以在h ...
- static全局变量与普通全局变量的区别,static局部变量与普通局部变量的区别,static函数与普通函数的区别
static全局变量与普通全局变量的区别 static全局变量和普通全局变量的存储方式没有不同,如果它们都已经初始化,那么存放在进程的数据段中,否则存放在bss段.这两者的不同点在于作用域不同,当一个 ...
- Static全局变量与普通的全局变量有什么区别?static函数与普通函数有什么区别?
Static全局变量与普通的全局变量有什么区别? 答: 全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式. 这两者 ...
- static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
答案:全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式. 这两者在存储方式上并无不同.这两者的区别虽在于非静态全 ...
- 预处理、const、static与sizeof-static全局变量与普通的全局变量有什么区别
1:全局变量的说明之前再加上static就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式.这两者在存储方式上并无不同.这两者的区别在于,非静态全局变量的作用域是整 ...
- C/C++中static的用法全局变量与局部变量
1.什么是static? static 是C/C++中很常用的修饰符,它被用来控制变量的存储方式和可见性. 1.1static的引入 我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它 ...
- C++静态全局变量和全局变量的区别
静态全局变量 非静态全局变量 存储方式 静态存储 静态存储 作用域 定义该变量的源文件内 所有源文件 解释: 共同点:全局变量(外部变量)的说明之前再冠以static 就构 成了静态的全局变量.全 ...
- c语言中static 函数和普通函数的区别
C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令: 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放 ...
- final与 static的区别;static代码块以及嵌套类介绍
本篇文章主要分为两个模块进行介绍:1.final,staic,static final之间的异同:2. static 模块:3.嵌套类的概念 1.final,staic,static final之间的 ...
随机推荐
- Error In Work
ReferenceError: BAD_REQUEST is not defined MyBatis配置错误,比如$!conflict.id,写成conflict.$!id
- 释放Linux磁盘空间的一种方法
1.用df 检查发现/根目录可用空间为0 [root@/]#df -h 2.用du检查发现 各目录占用的空间都很少,有约3G的空间莫名其妙地丢了. [root@/]# du -m ...
- android开发之ExpandableListView的使用,实现类似QQ好友列表
由于工作需要,今天简单研究了一下ExpandableListView,做了一个类似QQ列表的Demo,和大家分享一下. 效果图如下: 先来看看主布局文件: <RelativeLayout xml ...
- Java实现希尔排序(增量递减排序)
package Insert.sort; import java.util.Scanner; /*又叫缩小增量排序,本质是插入排序,将待排的序列增量分成几个子序列,分别对每个子序列进行直接插入排序 * ...
- flex脚本的申明
//脚本申明的格式 <fx:Script> <![CDATA[ ]]></fx:Script> //程序完成的时候自动调用的事件 cre ...
- iOS类初始化
类继承下来的初始化有三种: +(void)load: +(void)initialize: -(instancetype)init: +(void)load:会自动调用(也可手动调用),只要有引用 ...
- java coding recommand
http://www.oracle.com/technetwork/java/codeconvtoc-136057.html
- StringBuffer与StringBuilder之间的区别
public class Test { public static void main(String[] args) { StringBuffer strBuffer = new StringBuff ...
- JAVA锁的可重入性
机制:每个锁都关联一个请求计数器和一个占有他的线程,当请求计数器为0时,这个锁可以被认为是unhled的,当一个线程请求一个unheld的锁时,JVM记录锁的拥有者,并把锁的请求计数加1,如果同一个线 ...
- 数据交互 ajax代码整理
请求列表通用 /** **加载对应的试卷套题 ** */ function loadQuestions(){ var businessSubClass = { pageNo:pageNo, pageS ...