精华内容
下载资源
问答
  • 以下是对C语言中的static修饰函数进行了详细的分析介绍,需要的朋友可以过来参考下
  • C语言static函数

    2020-06-14 12:46:58
    前几天,一个同事跟我说在我们的代码库里面看到,一个static函数被放在了头文件里面,可构建的时候却没有报告链接错误。我的第一反应也是,函数被放在头文件里面,当这个头文件被多个源文件引用之后,再把那几个...

    前几天,一个同事跟我说在我们的代码库里面看到,一个static函数被放在了头文件里面,可构建的时候却没有报告链接错误。我的第一反应也是,函数被放在头文件里面,当这个头文件被多个源文件引用之后,再把那几个源文件编译产生的目标文件链接起来的时候,应该会产生重定义错误的……

    后来又仔细一想,static关键字不正是解决不同的源文件中、同名函数的命名冲突问题的吗?于是,快速做了一个小验证:

    //“static_func.h”
    #include <stdio.h>
    static void display() {
        printf("This is static function in a header file.\n");
    }
    
    //“funcA.c”
    #include "static_func.h"
    void funcA() {
        printf("This is funcA...\n");
        display();
    }
    
    //“funcB.c”
    #include "static_func.h"
    void funcB() {
        printf("This is funcB...\n");
        display();
    }
    //“main.c”
    extern void funcA();
    extern void funcB();
    int main()
    {
        funcA();
        funcB();
        return 0;
    }

    正常编译、链接没有问题,可执行文件也能正常执行,证明了存在同名static函数的不同源文件链接到一起是没有问题的。

    虽然还不清楚编译器具体是怎么实现的,但是对于C语言的static函数可以简单的理解为,编译器在处理static函数时,可能把static函数所在文件的文件名当成了函数名的一部分,类似于C++中命名空间的概念。


    使用‘nm’命令查看可执行文件,除了看到函数‘funcA’和‘funcB’之外,还看到了两个‘display()’,编译器最终是怎么区分这两个同名的函数的暂时还没有搞清楚,有待后续再进一步研究。

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

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

    展开全文
  • c语言static 函数和普通函数的区别?

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

    转自:https://bbs.csdn.net/topics/350238100

    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里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含对,不要弄混。


    展开全文
  • C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条,分别是: 一是隐藏功能,对于static修饰的函数和全局变量而言 二是保持持久性功能,对于static修饰的局部变量而言。 三是因为存放在静态区...
  • c语言static函数的用法

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

    static 使用

    static 修饰的变量/函数称为静态成员变量/函数
    static在c语言中用法主要为:
    1. 修饰局部变量
    2. 修饰函数和全局变量

    1. static修饰局部变量

    static修饰局部变量时该变量存放在静态存储区, 生命周期为整个程序运行结束。

    static局部变量初次定义时必须初始化,且只能初始化一次。(若不初始化,编译器就会自动赋值为0);(也就是说:重复调用同一个函数时,第一次调用时初始化,第二词次调用时就不会执行变量初始化那条语句啦)

    特点:static局部变量”记忆性”与生存期的”全局性”
    所谓的记忆性,主要是指函数在俩次调用时,第二次调用进入时,能保持第一次退出时的值。

    #include <iostream>
    
    void staticLocalVar()
    {
        static int a = 0; //运行期间初始化一次,第二次调用时不在进行初始化工作
        printf("%d", a);
        a++;
    }
    int main()
    {
        staticLocalVar(); // 第一次调用,输出 a = 0
        staticLocalVar(); // 第二次调用,输出 a = 1
        return 0;
    }

    注意事项:
    1,“记忆性”,程序运行很重要的一点就是可重复性,而static变量的记忆性破坏了这种可重复性,造成不同时刻运行的结果可能不同。
    2,“生存期”全局性和唯一性,普通的local变量的存储空间分配在栈上,因为每次调用函数时,分配的空间都可能不一样,而static具有全局唯一性的特点,每次调用时,都访问同一块内存,这就造成了一个很重要的问题,不可重入性

    2

    当static修饰全局变量或者函数时,不是为了限制其存储方式,而主要是为了限制该全局变量或者函数的作用域仅限于本文件,所以又称为内部函数。此时,对于外部全局变量,不是是否有static关键字,它的存储区域都在静态存储区,生存期是全局的。此时的static只是起作用域限制作用,限定作用域在本模块内部。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

    参考文章:https://blog.csdn.net/y780465649/article/details/52155641

    展开全文
  • C语言中的static函数

    2019-10-11 17:46:20
    C语言是以文件文件为单位组织的,在...这里主要介绍static函数,是对今天的一个编译问题的总结。 学过C++ 应该都知道,类成员有三种类型:public,protected,private。其中private关键字表示该字段只能被该类的成员...
  • 主要介绍了C语言 static、extern与指针函数,有需要的朋友可以参考一下
  • C语言函数定义时前加static 作用

    千次阅读 多人点赞 2019-07-07 16:53:49
    C语言函数定义时前加static 作用 1.作用 函数中加“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 2.好处 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否...
  • c语言static关键字用法详解

    万次阅读 多人点赞 2018-04-05 18:18:14
    概述 static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。 ...普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰...
  • C语言static的使用

    千次阅读 多人点赞 2019-05-10 16:55:13
    C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。 (1)先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为...
  • C语言static加在函数声明前

    千次阅读 2016-11-05 14:42:54
    C语言中,也有“private函数”,它就是接下来要说的static函数,完成面向对象编程中private函数的功能。 当你的程序中有很多个源文件的时候,你肯定会让某个源文件只提供一些外界需要的接口,其他的函数可能是...
  • C语言static 函数

    2013-08-19 10:12:48
    在C里面,所谓 static ,只是限制在当前源文件————...例如:使用函数指针/变量指针,完全可以访问其他文件的 static 变量/函数 file01.h int * iptr01; typedef void (* funcPtr)(void); funcPtr p
  • (1.cpp) #include <stdio.h> #include "2.h" void main() { my();... printf("我是外边的的函数,我被调用了\n"); } 2.h头文件 void my(); 上面的非常好,没问题。 如果是s...
  • C语言static静态变量的理解及相关函数实例最近在学习c语言statci时遇到了一些问题,现在贴一个代码块实例加深自己的理解 最近在学习c语言statci时遇到了一些问题,现在贴一个代码块实例加深自己的理解 去博客设置...
  • C_语言静态变量和静态函数,可以让您对C语言静态变量和静态函数有更清晰的认识
  • C语言中的static函数: 内部函数和外部函数 函数一旦定义后就可被其它函数调用。但当一个源程序由多个源文件组成时,在一个源文件中定义的函数能否被其它源文件中的函数调用呢。为此,C语言又把函数分为两类: 一、...
  • 在头文件定义了函数,可能会在多个源文件中包含相同的头文件,如果不加static,当编译器展开头文件时,同一个函数会被定义多次。 使用static关键字会把它定义为本地函数,其作用域限制在本文件内。 不适用static就...
  • C语言static修饰函数和变量用法

    千次阅读 2020-05-22 10:22:25
    c语言static关键字可以修饰函数和变量。修饰变量又可以分为修饰全局变量和局部变量。static作用是限定变量的生命周期,限定变量或函数的作用域。 写在前面: 变量的生命周期是指,相对于程序运行的进程生命周期...
  • function1、Static variable2、静态局部变量(static local variable)3、静态全局变量(static global variable)4、静态函数static function)5、代码块(Code block) 1、Static variable     &...
  • 关于C语言static定义函数类型的具体解释 分类? C语言知识2011-08-17 11:34?231人阅读? 评论(0? \o "收藏" 收藏? \o "举报" 举报 ? ? 内部函数和外部函数? 函数一旦定义后就可被其它函数调用 ? 但当一个源程序由多个...
  • C语言static使用过程的一些疑惑在编写嵌入式的程序时,常常遇到static去修饰函数和变量,有时候就很迷惑修饰作用,下面是一点心得记录下来:一、修饰函数假设我们有a.c和b.c两个文件,fun1函数在文件a.c中,那么该...
  • C语言static修饰函数的作用与原理

    千次阅读 2018-01-23 09:18:00
    static修饰的func函数只能在static.c这个文件内被访问,在其他文件内则无法访问此函数,否则会造成 undefined reference(找不到函数定义)错误。 //static.h int add(const int a, const int b); //static.c ...
  • c语言static关键字参数

    2020-10-20 13:21:04
    1,static 修饰变量. ① 静态的局部变量; 延长了局部变量的生命周期,static变量只被初始化一次,下一次被调用会由依据这一次的结果值, ②修饰全局变量;...c语言的项目是由多个源文件组成,而每一个源文件 ` ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 142,016
精华内容 56,806
关键字:

c语言static函数

c语言 订阅