精华内容
下载资源
问答
  • c语言static函数声明和函数定义 都在.c文件 都要加static修饰

    c语言static函数声明和函数定义 都在.c文件 都要加static修饰

    展开全文
  • static函数与普通函数

    千次阅读 2013-09-10 10:47:30
    原文:static函数与普通函数 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也 是静态存储方式。这两者在存储方式上并无不同。这两者的区别...

    原文:http://blog.163.com/sunshine_linting/blog/static/44893323201191294825184/

    全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也
    是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多
    个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文
    件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数
    公用, 因此可以避免在其它源文件中引起错误。

    static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
    static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
    static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

    C程序一直由下列部分组成:
          1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;    
      2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。    
      3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。     
      4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。      
      5)堆——动态存储分。

    在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
       1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
      2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
       3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

    好处:
    定义全局静态变量的好处:
    <1>不会被其他文件所访问,修改
    <2>其他文件中可以使用相同名字的变量,不会发生冲突。

    局部静态变量
    在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
      1)内存中的位置:静态存储区
      2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
      3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

     注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量
    在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。
    当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位
    置,还是在静态存储区中。

    3. 静态函数
    在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
      函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。
    定义静态函数的好处:
    <1> 其他文件中可以定义相同名字的函数,不会发生冲突
    <2> 静态函数不能被其他文件所用。 存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。 
    auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该
    程序块时撤销。


    关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage 
    duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静
    态局部对象在程序执行到该对象的声明处时被首次初始化。
    由于static变量的以上特性,可实现一些特定功能。
    1. 统计次数功能
    声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调
    用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较
    困难。

    C语言中使用静态函数的好处:
    静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。 
    关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对
    函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文
    件中的函数同名,因为同名也没有关系。 
    c语言中static的语义

    1.static变量:
    1).局部
    a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 
    尽管该变量还继续存在,但不能使用它。
    b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
    2).全局全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是
    整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程
    序的其它源文件中不能使用它。

    2.static函数(也叫内部函数)
    只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可
    以用来修饰变量,也可以用来修饰函数。 先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平
    时所说的堆栈是栈而不包含对,不要弄混。

    展开全文
  • static函数与普通函数有什么区别

    千次阅读 2018-04-03 21:37:59
    static函数与普通函数的区别: 用static修饰的函数,本限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。 在函数的返回类型前...
    static函数与普通函数的区别:
    
      用static修饰的函数,本限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。
      在函数的返回类型前加上关键字static,函数就被定义成为静态函数。普通 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。因此定义静态函数有以下好处:
      <1> 其他文件中可以定义相同名字的函数,不会发生冲突。

      <2> 静态函数不能被其他文件所用。

    静态函数是函数的一种,函数包括静态函数和非静态函数两种。
    其中静态函数是有static修饰的函数,如果没有,则为非静态函数(全局函数)。

    当整个程序只有一个C文件时,二者没有区别。
    当程序是由多个C文件组成时,二者的作用域,即可使用的范围不同。
    其中,静态函数(带static的),只能在本文件中使用,无法跨文件。
    而非静态函数(不带static的),可以在任何一个文件中使用。当在其它文件中使用时,需要做函数声明后再使用。

    展开全文
  • 当使用static函数来做一个窗口过程函数时,static函数可以通过编译,但是它本身无法访问类的成员函数和数据,如果我们能够得到类的指针并交给static函数处理则可以实现我们的要求。 技巧:为了确保非static窗口过程...

    概论:

         类的非static函数本身含有一个this指针,所以这种函数不能作为一个窗口过程(callback function )。当使用static函数来做一个窗口过程函数时,static函数可以通过编译,但是它本身无法访问类的成员函数和数据,如果我们能够得到类的指针并交给static函数处理则可以实现我们的要求。

     

    技巧:

    为了确保非static窗口过程能够处理所有的消息,所以我们使用了CBT Hook(),这样我们就可以在窗口创建之前把类的指针交给static的窗口过程,他就可以调用类的成员函数。

    在这个过程当中,我们还使用了Thread Local Storage TLS)。

     

    步骤:

    1:分配一个TLS空间来保存this指针。

    DWORD TlsIndex=::TlsAlloc();

     

    2: 声明一个结构体TLSData,将this指针和HHOOK句柄保存下来,将他的指针放在在TLS中。

    TLSData* pTLSCreateData = new TLSData;

    pTLSCreateData->hHook=hHook; //hHook=::SetWindowsHookEx(WH_CBT,

    //CWin::StaticCBTProc, 0, ::GetCurrentThreadId());

    pTLSCreateData->pThis = this;

    ::TlsSetValue(TlsIndex  //就是上面TlsIndex=::TlsAlloc();

    , pTLSCreateData);

     

    3:在窗口创建之前,HCBT_CREATEWND 消息会发送给staticCBTProc也就是hHook的回调函数。

    TLSData* pTLSCreateData = (TLSData*)TlsGetValue(TlsIndex);

    ~~~~~ * w = (~~~~~~*) pTLSCreateData->pThis;//~~~~~:表示对应的那个类。

    ::SetWindowLong((HWND) wParam, GWL_USERDATA, (LONG)w);

    //说明;这里的pTLSCreateData->hHook,

    //是给函数CallNextHookEx(pTLSCreateData->hHook, msg, wParam, lParam);服务的。

     

    4:在注册窗口类时,已经把一个static函数注册成为他的窗口过程,所以在这个函数中,我们把指针交给他处理。

    ~~~~~ *w = (~~~~~~*) (LONG)::GetWindowLong(hWnd, GWL_USERDATA);

    return w->WndProc(hWnd, uMsg, wParam, lParam);

     

    5 :即时的

           ::UnhookWindowsHookEx(hHook);

           delete pTLSCreateData;

    ::TlsSetValue(TlsIndex, NULL);

     

    总结:方法是死的,重要的是灵活运用。

    展开全文
  • static函数与普通函数区别

    千次阅读 2014-05-04 19:42:26
    static函数与普通函数区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽...
  • 栈(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值(除static),其操作方式类似于数据结构中的栈。 堆(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构...
  • 于是我把swap函数修饰为static ,那么我的swap函数需要在头文件中声明吗? 没有C币了不好意思。。。 ``` /*sort.cpp*/ #include"sort.h" static void swap(int &a, int&b) { int t = a; a = b; b = t; } ...
  • 转自:http://blog.163.com/sunshine_linting/blog/static/44893323201191294825184/全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态...
  • title: 为什么虚函数(virtual)不能是static函数 date: 2016-06-08 15:22:30 categories: C++ tags: - C++ - C简而言之,成员函数实例相关,静态函数类相关。虚函数,是一种特殊的成员函数,用来实现运行时...
  • 一般的static函数,执行后会常驻于内存,以便其它程序再次调用。加上__init标识后,该函数只会被调用一次,调用之后,函数立即被回收,以节约内存开销。
  • C语言中的static函数

    千次阅读 2016-07-02 19:44:24
    C语言是以文件文件为单位组织的,在一个源程序...这里主要介绍static函数,是对今天的一个编译问题的总结。 学过C++ 应该都知道,类成员有三种类型:public,protected,private。其中private关键字表示该字段只能被
  • c语言中static 函数和普通函数的区别?

    万次阅读 多人点赞 2018-05-17 09:43:38
    2.static函数(也叫内部函数)只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可以用来修饰变量,也可以用来修饰函数。 先看用来修饰变量的...
  • static修饰符:static变量,static函数

    千次阅读 2008-09-19 15:08:00
    static有两种用途:一是修饰变量,二是修饰函数 第一:修饰变量例子:static int a;void Func(){ static int b;}全局变量默认的存储类型是extern,若不加static修饰,在不同头文件中定义名字相同的全局变量会发生...
  • static函数的申明

    千次阅读 2017-06-27 14:42:07
    static 声明的变量在C语言中有两方面的特征:   1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。   2)、变量用static告知编译器...
  • 3 从分配内存空间看static全局变量和普通全局变量区别:区别: 1.static全局变量编译是初始化,在main()函数之前初始化并且仅初始化一次;  2.static全局变量限定了作用范围,仅在定义该变量的源文件中有效,由于...
  • 然后我想在这个函数前加上static,我试过只在声明的时候加, 只在定义的时候加,还有声明和定义的时候都加,都无法通过 编译,linux下c语言写的,我现在不想把这个函数的代码提到 前面去,就想要先声明后定义,而且...
  • c语言中static函数的用法

    千次阅读 2018-05-10 17:22:55
    static 修饰的变量/函数称为静态成员变量/函数
  • 静态(static)函数与普通函数

    万次阅读 2018-07-14 16:21:58
    static函数与普通函数的区别:  1.用static修饰的函数,限定在本源码文件中使用,不能被本源码文件以外的代码文件调用。  2.普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。    若在...
  • static声明函数和变量小结

    千次阅读 2015-07-24 15:54:48
    static 声明的变量在C语言中有两方面的特征:  1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。  2)、变量用static告知编译器,...
  • C语言中的 static变量、static函数 1. static 变量  静态变量的类型 说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例如外部变量虽属于静态 存储方式...
  • class A { static int si; static void sfunc(){cout&...类的static member不会存在每一个具体的class object之中,而是存放在全局变量区,不论一个class有多少个具体实例,static data都只有一个。 ...
  • 转载自:CSDN-悠悠红茶 作为函数,不管其是不是static的,在代码段中都只有一份。每次对函数的调用, 一般而言都是一条call指令(当然还要参数入栈等动作...理解为其他.c文件)中调用,而static函数只能在其所在的...
  • 内联函数和普通函数最大的区别在于内部的实现方面,当普通函数在被调用时,系统首先跳跃到该函数的入口地址,执行函数体,执行完成后,再返回到函数调用的地方,函数始终只有一个拷贝; 而内联函数则不需要进行一个...
  • c语言中的static变量和static函数

    千次阅读 2012-08-31 14:32:33
    当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。 下面是a.c的内容 char a = 'A'; //...
  • static 函数定义在头文件中有什么作用?学渣求教,static 不就是要限制作用域吗?
  • 一个常规的成员函数声明描述了三件在逻辑上相互不同的事情 1. 该函数能访问类声明的私用部分 2. 该函数位于类的作用域之中 3. 该函数必须经由一个对象去激活(有一个this指针)   通过将函数声明为友元函数 1....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,651,952
精华内容 660,780
关键字:

怎么声明static函数