精华内容
下载资源
问答
  • static修饰全局变量

    2017-11-12 21:23:39
    static修饰全局变量 static(限离出境) #include "stdafx.h" //static修饰后的全局变量比起没加修饰的 实始化没变,作用域改变 生命周期没变 //作用域 限制全局变量为本文件内的全局变量,也就是限制了其外延性...

    static修饰全局变量

    static(限离出境)

    #include "stdafx.h"
    
    //static修饰后的全局变量比起没加修饰的 实始化没变,作用域改变  生命周期没变
    //作用域 限制全局变量为本文件内的全局变量,也就是限制了其外延性(限制了extern)
    // 尽量少用 全局变量(不加static修饰的),带来命名污染。除非专业的人员来管理
    // 本文件内的全局(加static修饰的),还是可以用的,并且,还经常使用。
    
    static int global = 100; //加static后相当于本文件内的全局变量(不会引发命名污染问题)
    
    void func();
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	func();
    	return 0;
    }
    
    void func()
    {
    	printf("global=%d\n", global);
    }

    其他文件中的外延性限制

    #include <stdio.h>
    
    //extern int global ; //如果上一个c文件中的 global变量前面
                          //加static修饰了,则不能使用extern来使用
    
    static int global = 50; //俩种本文件内的全局变量不发生冲突
                            //也就是这个.c里面的global不会和上个.c里面的global冲突
    void foo()
    {
    	printf("globle=%d\n", global);
    }


    展开全文
  • extern和static修饰全局变量的区别

    千次阅读 2014-09-29 13:42:04
    extern static修饰全局变量的区别

    在实际开发C++项目的时候,一个项目里面往往会包含多个cpp文件,多个头文件,有时还会有c文件。由于变量的声明可以有多次,但定义只能有一次,这就不可避免地要使用extern,static关键字。弄清楚这几个关键字之间的用法和区别,能节省很多调试项目的时间,尤其是对于一些难以定位的链接错误。下面分别介绍:

    一、extern关键字

    这个关键字可能是最容易用错的一个,一方面可能是因为平时写的小程序不太会用到这个关键字,另一方则是这个关键字确实有些不太容易理解的用法。

    extern关键字主要有两个作用:1、声明一个全局变量;2、extern “C” { /*用C实现的内容(通常写在另外的.c文件中)*/ }

    1、当用extern声明一个全局变量的时候,首先应明确一点:extern的作用范围是整个工程,也就是说当我们在.h文件中写了extern int a;链接的时候链接器会去其他的.cpp文件中找有没有int a的定义,如果没有,链接报错;当extern int a;写在.cpp文件中时,链接器会在这个.cpp文件该声明语句之后找有没有int a的定义,然后去其他的.cpp文件中找,如果都找不到,链接报错。另外值得注意的一点是,当extern语句出现在头文件中时,不要将声明和定义在一条语句中给出,也就是不要在头文件中写类似于这样的语句:

    extern int a = 1;

    这种写法,在g++编译时会给出一个警告:warning: 'a' initialized and declared 'extern'。

    这样做的一个可能的原因是:担心在其他的.cpp文件中忘记给出该变量的定义,所以干脆就在声明的时候直接给出定义得了,省得链接时候报错说变量a没有定义。

    对变量没有定义的忧虑是应该提倡的,但解决这种忧虑的办法却弄巧成拙了。试想以下程序结构:

    头文件A.h

    extern int a = 1;
    

    头文件B.h

    #include "A.h"

    源文件A.cc

    #include "A.h"
    #include "B.h"
    
    int main(){
        int t = a;
    
        return 0;
    }
    这样一来,编译A.cc时,会报错说变量a重复定义。

    当我,我们可以通过在头文件A.h中加上头文件保护符来解决这个编译错误,但将全局变量的定义放在头文件中总归是不好的。

    遵照的法则其实很简单:只在头文件中通过extern给出全局变量的声明,在源文件中给出定义(并且只能定义一次)。

    2、C++完全兼容C,当extern与“C”连用时,作用是告诉编译器用C的编译规则去解析extern “C”后面的内容。最常见的差别就是C++支持函数重载,而标准C是不支持的。如果不指明extern “C”,C++编译器会根据自己的规则在编译函数时为函数名加上特定的后缀以区别不同的重载版本,而如果是按C的标准来编译的话,则不需要。


    二、static关键字

    static关键字的作用有很多,声明静态全局变量,类的静态成员等。这里主要讨论他在修饰全局变量时与extern的区别。有两点需要注意:

    1、static修饰全局变量时,声明和定义是同时给出的;2、static的全局作用域只是自身编译单元

    一个编译单元指一个.cpp文件和他所包含的头文件。也就是说static在修饰全局变量时,“全局”的范围是小于extern的。因此,在头文件中用static声明(和定义)全局变量,是不会出现上面讨论的重复定义的问题的。

    还有一点需要说明的是:static也可以修饰局部变量,用static修饰的变量都是保存在静态存储区的,当然全局变量不管用不用static修饰都是存在静态存储区,那全局变量用static修饰和不用static修饰有什么区别呢?区别就在于“全局”的范围是整个工程,还是自身编译单元。

    展开全文
  • 一、全局变量static全局变量 首先要清楚全局变量本身就是静态存储,加上static肯定也是静态存储。 两者的主要区别在于作用域。 普通的全局变量其作用域为整个源程序,各个源文件之间都可以访问到这个普通全局...

    一、全局变量与static全局变量

    首先要清楚全局变量本身就是静态存储,加上static肯定也是静态存储。

    两者的主要区别在于作用域。

    普通的全局变量其作用域为整个源程序,各个源文件之间都可以访问到这个普通全局变量。

    静态的全局变量其作用域仅为定义该变量的源文件,其他源文件访问不到这个静态全局变量吗,更加安全。

    另外,static全局变量只能初始化一次。

    二、局部变量与static局部变量

    这两者的主要区别在于:

    局部变量本身是存储在栈区,加上static后存储在静态区。

    另外,static局部变量只能被初始化一次。

    三、普通函数和static函数

    这两者的区别也是作用域。

    static函数仅能在当前源文件内部之间互相调用。 static函数在内存中只有一份。 普通函数每次调用都会存一份。

    展开全文
  • 1. static全局变量与普通的全局变量有什么区别 ?  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。  全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储...

    1. static全局变量与普通的全局变量有什么区别 ?

     全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。

      全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。

      这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 

    static全局变量只初使化一次,防止在其他文件单元中被引用;   

    2.  static局部变量和普通局部变量有什么区别 ?

       把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。  

      static局部变量只被初始化一次,下一次依据上一次结果值;   

    3.  static函数与普通函数有什么区别?

       static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.

    static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

    总结:

    static的三个作用(1)全局变量用static修饰,作用域变小(2)局部变量用static修饰,作用周期变长(3)变量被static修饰默认值是0

    一位网友关于static的博客:http://www.cnblogs.com/dc10101/archive/2007/08/22/865556.html,写得很不错!!

    展开全文
  • static作用(修饰函数、局部变量、全局变量) 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。 (1)先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加...
  • static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量全局变量本身...
  • 全局变量   我们都知道全局变量具有全局链接属性。 A.cpp int a = 0; B.cpp extern int a ; int main() { a =1 ; }   这是因为当链接的时候,链接器处理 B.cpp 经过处理的 B.o 的时候,发现一个未解析的全局...
  • static修饰全局变量和没有static修饰全局变量的存储方式都是静态存储区。 static修饰全局变量的作用域限定在当前文件 没有static修饰全局变量可以跨文件使用 一般使用extern声明后可以使用。 可以在变量被...
  • static 修饰全局变量 - 静态全局变量 static 修饰函数 - 静态函数 static 关键字的三种用法1. static 修饰局部变量 - 静态局部变量2. static 修饰全局变量 - 静态全局变量3. static 修饰函数 - 静态函数 1. static ...
  • 一、static修饰全局变量: 当一个进程的全局变量被声明为static之后,它的中文名叫静态全局变量。静态全局变量和其他的全局变量的存储地点并没有区别,都是在.data段(已初始化)或者.bss段(未初始化)内,但是它只...
  • static修饰变量

    千次阅读 2018-04-24 16:04:52
    static 修饰的局部变量和全局变量1.static修饰局部变量:改变了变量的生命周期(整个项目)但是不改变变量的范围(仍然是局部范围)2.static修饰全局变量改变了变量的范围;(不能被为外部源文件引用,即:不能用...
  • 一、static修饰局部变量 局部变量的作用范围为定义该局部变量的代码块或函数范围内有效,局部变量的生命周期随着函数的调用而创建,并且随着函数调用结束而销毁。static修饰的局部变量的作用域并不会改变,只是...
  • 为什么要在全局变量上加上static修饰符为什么要在全局变量上加上static修饰符为什么要在全局变量上加上static修饰符 全局变量,会带来命名污染,...static修饰全局变量以后,处延性消失,变成本文件内部的全局变量 ...
  • 多线程中,有时候需要调用多线程的时候需要传参,如果全局变量static修饰,会导致变量被共享,这些变量值被用到的时候不一定会是最新的。 public class SqlQueryThread implements Callable { private static ...
  • static函数修饰全局变量和局部变量

    千次阅读 2019-04-09 17:59:49
    static int a=1; void fun1(void){ a=2; } void fun2(void){ int a=3; } void fun3(void){ static int a=4; } int main(int argc,char** args){ printf(“%d”,a); fun1( ); prin...
  • 使用static修饰在头文件中修饰的变量,此时不会产生冲突(用static修饰全局变量的作用域为定义的源文件),在多个源文件中引用该头文件,等于是在每个源文件中都定义了该变量一次,而且此变量仅在本源文件中有效,...
  • //static修饰全局变量和局部变量 int main() { int i = 0; for (i = 0; i {  int num = 1; num++; printf("%d\t", num);//2,2,2,2,2 } system("pause"); return 0; } int main() { int i...
  • Static修饰全局变量叫做静态全局变量, Static修饰局部变量叫做静态局部变量, Static修饰函数叫做静态函数; 静态全局变量:限制变量的作用域,仅在本文件中访问,其他文件不可访问; 静态局部变量:仅在本函数...
  • c语言中extern和static修饰全局变量static修饰全局变量只在当前文件编译的.o中有效。 1) 在a.c中写了个static int x; ,在b.c中extern int x; 是不行的,链接提示符号未定义,因为a.c中定义的static只能用于...
  • 在我们刚开始接触接触C语言的时候一定听说过static关键字,在刚开始学习C语言的时候... 2):static修饰全局变量 3):static修饰函数一、static修饰局部变量普通的局部变量是在栈上进行分配的,局部变量所处的函数
  • static修饰局部变量

    2020-03-19 10:08:54
    static 修饰局部变量 { … static int a = 10; //初始化 a为10 只能初始化一次在整个进程中,这么使用一般作为被调用的函数 static int b;...C语言:static作用(修饰函数、局部变量、全局变量 ...
  • static关键字至少有下列n个作用...(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; (3)限制函数的作用域,在模块内的static函数只可被这一模块内的其
  • C语言--static修饰变量

    千次阅读 2013-08-06 09:53:08
    Static在C语言里面有两个作用,第一个是修饰变量,第二个是修饰函数。1、Static修饰变量按照作用范围的不同,变量分为局部变量和...我们用static修饰全局变量的主要目的就是:使得其作用域仅限于变量被定义的文件中
  • 全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是...
  • 2.修饰全局变量-静态局部变量 3.修饰函数-静态函数 今天举一个修饰局部变量的,我一开始以为可以将局部变量变为全局变量使用,但是代码写完发现结果不是我想的那样 后来发现这里的static修饰局部变量只是改变了变量...
  •  static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量。  不能用const的原因:一个静态成员函数访问的值是其...
  • 在c语言中,static有好几种作用,下面介绍: 1.隐藏的作用 比如说我们在一个源代码文件中定义了一个整型变量a(全局变量)。那么在整个项目中a都是可见的,如果在其前面...static修饰的变量全部存储在静态数据区,在
  • static全局变量与普通的全局变量

    万次阅读 多人点赞 2018-03-12 21:58:59
    一、程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分:1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等...3、全局区(静态区)(static)— 全局变量和静态变量的存...
  • 关于static修饰的静态变量的唯一性 ,为什么不同对象多次访问TA输出的是一次,如题所示

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 88,408
精华内容 35,363
关键字:

static修饰全局变量