精华内容
下载资源
问答
  • 描述:在C/C++语言程序中,特别是的大型程序,当中的函数往往用static关键词修饰。 原因:主要的原因是避免命名冲突。static函数与一般函数作用域不同,仅在本文件。

    描述:在C/C++语言程序中,特别是的大型程序,函数名前往往用static关键词修饰。

    作用:主要的作用是避免命名冲突。static函数与一般函数作用域不同,仅在本文件有效。这样在大型程序中可避免命名冲突。

    展开全文
  • static修饰函数作用与意义

    万次阅读 多人点赞 2018-03-11 20:37:32
    static修饰函数叫做静态函数,静态函数有两种,根据其出现的地方来分类:如果这个静态函数出现在类里,那么它是一个静态成员函数; 静态成员函数作用在于:调用这个函数不会访问或者修改任何对象(非static)...

    static修饰的函数叫做静态函数,静态函数有两种,根据其出现的地方来分类:

    • 如果这个静态函数出现在类里,那么它是一个静态成员函数

            静态成员函数的作用在于:调用这个函数不会访问或者修改任何对象(非static)数据成员

            其实很好理解,类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。

    • 如果它不是出现在类中,那么它是一个普通的全局的静态函数
            这样的static函数与普通函数的区别是:用static修饰的函数,限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说它可以被其它代码文件调用。

      在函数的返回类型前加上关键字static,函数就被定义成为静态函数。普通 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。因此定义静态函数有以下好处:
      <1> 其他文件中可以定义相同名字的函数,不会发生冲突。
      <2> 静态函数不能被其他文件所用。

    展开全文
  • 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 ...

    static可以用来限制函数的可见性

    // static.c
    static void func(){}
    

    被static修饰的func函数只能在static.c这个文件内被访问,在其他文件内则无法访问此函数,否则会造成 undefined reference(找不到函数定义)错误。

    //static.h
    int add(const int a, const int b);
    
    //static.c
    static /* 当外部访问此函数会出现 undefined reference to 'add' */
    int add(const int a, const int b)
    {
        return a + b;
    }
    
    // main.c
    #include "static.h"
    #include "stdio.h"
    
    int main()
    {
        printf("sum is %d\n", add(10, 20));
        return 0;
    }
    // gcc main.c static.c -o main
    // main.c:(.text+0xf): undefined reference to `add'
    

    通过static来避免命名冲突

    1. 明确头文件(.h)与源文件(.c)的区别:
      在C语言中头文件提供符号的申明,源文件则提供符号的定义。
      这里的符号包含函数名和变量名等
    2. 从C源代码到可执行程序需要经历两个步骤:
      编译:将源文件翻译成二进制的目标文件.o(bj)
      链接:将各个目标文件链接成一个可执行程序
    3. 在编译时如果遇到未知的符号,则会到各个头文件中去查找符号的定义,找不到就会报错。然后根据相应的词法语法规则翻译成对应的二进制代码。因为只需提供符号的定义就可以实现编译,所以各个源文件可以单独编译成单个.o(bj)文件。
    4. 链接时会根据入口函数(main)扫描所有目标文件将所有符号的实现全部合并到一个文件中,如果找不到符号实现,则会报错(undefine reference)。而如果在不同文件中有相同的符号名,则可能出现符号的重复定义(函数或变量重名)。
    5. 编译时符号的可见性默认是全局的(global),而static可以将其修改为本文件可见。
      通过static将某些函数定义为内部可见,以此来避免命名冲突。
    //demo.h
    // definition
    int Symbol(const int value);
    int Count(const int value);
    
    //demo.c
    // implementation
    int Symbol(const int value)
    {
        return value;
    }
    
    //demo.bar.c
    static /* 如果去掉,则会导致 mutiple definition */
    int Symbol(const int value)
    {
        return value * 100;
    }
    
    int Count(const int value)
    {
        return Symbol(value);
    }
    
    // main.c
    #include <stdio.h>
    #include "demo.h"
    
    int main()
    {
        int value = 100;
        int ret   = Symbol(value) + Count(value);
        printf("value is %d\n", ret);
        return 0;
    }
    
    // gcc main.c demo.c demo.bar.c -o main
    // sum is 10100
    

    如上面这个例子中,在demo.h头文件中定义了两个函数Symbol与Count,其实现分别放在两个文件demo.c与demo.bar.c中,且两个源文件都实现Symbol函数,通过static隐藏了demo.bar.c的实现来避免命名冲突。

    从汇编来看static的实现

    // static.c
    static void func1(){}
    static void func2(){}
    // gcc -S static.c
    
    // static.bar.c
    void func1(){}
    void func2(){}
    // gcc -S static.bar.c
    

    下面是汇编代码,可见连个文件基本相同,不同的事在static.bar.s文件中多了 .globl func1 与 .globl func2 这两条伪指令。而 .globl symbol这条伪指令就是告诉链接器在链接时,这个符号是全局的,可以被链接的(外部可见),如果没有这条伪指令修饰的符号,就是不需要链接的

    	.file	"static.c"                   .file   "static.bar.c"
    	.text                                .text
    	                                     .globl  func1 #这里不同
    	.type	func1, @function             .type   func1, @function
    func1:                              
    .LFB0:                            
    	.cfi_startproc                   
    	pushq	%rbp                      
    	.cfi_def_cfa_offset 16
    	.cfi_offset 6, -16
    	movq	%rsp, %rbp
    	.cfi_def_cfa_register 6
    	popq	%rbp
    	.cfi_def_cfa 7, 8
    	ret
    	.cfi_endproc
    .LFE0:
    	.size	func1, .-func1               .size   func1, .-func1
    	                                     .globl  func2 #这里不同
    	.type	func2, @function             .type   func2, @function
    func2:
    .LFB1:
    	.cfi_startproc
    	pushq	%rbp
    	.cfi_def_cfa_offset 16
    	.cfi_offset 6, -16
    	movq	%rsp, %rbp
    	.cfi_def_cfa_register 6
    	popq	%rbp
    	.cfi_def_cfa 7, 8
    	ret
    	.cfi_endproc
    .LFE1:
    	.size	func2, .-func2
    	.ident	"GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4"
    	.section	.note.GNU-stack,"",@progbits
    
    
    Reference
    1. linux汇编.section与.globl
    2. C语言的编译链接过程详解

    转载于:https://my.oschina.net/tigerBin/blog/1611580

    展开全文
  • static修饰函数,局部变量和全局变量的用法 在c语言中static关键字可以修饰函数和变量。修饰变量又可以分为修饰全局变量和局部变量。static作用是限定变量的生命周期,限定变量或函数的作用域。 写在前面: 变量的...

    static修饰函数,局部变量和全局变量的用法

    在c语言中static关键字可以修饰函数和变量。修饰变量又可以分为修饰全局变量和局部变量。static作用是限定变量的生命周期,限定变量或函数的作用域。
    写在前面:
    变量的生命周期是指,相对于程序运行的进程生命周期,变量存在的时间段。变量的生命周期由变量的存储类型(位置)决定。因此static的第1种含义也可以理解为,static定义了变量的存储类型(位置)。

    C语言中,变量存储位置分为栈、全局静态区、堆。栈用来做函数调用,参数传递等,在程序的运行过程中是操作最频繁的数据区。全局静态区,是变量一直存在于内存中,在程序整个运行过程中不会被销毁。堆,是由操作系统维护的大空间内存伸缩区,进程可以主动向操作系统申请使用堆的存储,在程序运行过程中动态申请。

    由static修饰的变量,其存储类型为全局静态区,变量在程序的整个运行过程中不会被销毁,并且只会被初始化1次。

    1,加static修饰的局部变量和普通局部变量

    写个代码举个例子

    #include <stdio.h>
    void func1()
    {
        static int var1 = 1;        // 在全局静态区分配变量var1的存储空间
        int var2 = 1;        // 在栈上分配var2的存储空间
    
        var1 = var1+1;    
        var2 = var2+1;
    
        printf("var1=%d, var2=%d\n", var1, var2);
    }
    
    int main(int argc, char *argv[])
    {
        func1();
        func1();
        func1();
    }
    

    代码输出:

    “var1=2, var2=2”

    “var1=3, var2=2”

    “var1=4, var2=2”
    说明被static修饰的局部变量生命周期是整个程序,但是作用域是和局部变量一样的,从定义开始,到最近的花括号结束

    2,加static修饰的全局变量和普通全局变量区别

    全局变量默认对其他声明文件来说是可见,可用的。在一个文件引用了另一个文件之后就可以使用这个文件的全局变量。static会限定全局变量的可见域,只在本文件的任何地方可以访问,但是对于其他文件是不可见的。

    3,static修饰函数

    在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
      函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。好处:
      <1> 其他文件中可以定义相同名字的函数,不会发生冲突
      <2> 静态函数不能被其他文件所用。 存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。 auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。
      关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。

    4, 总结

    关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
      static在c里面可以用来修饰变量,也可以用来修饰函数。 用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含堆,不要弄混。
      c语言中static的语义
        1.static变量:
          1).局部变量。
            a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。
            b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。      
          2).全局变量。
            全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
        2.static函数(也叫内部函数)
          只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数)。

    展开全文
  • static修饰函数和变量

    千次阅读 2012-03-15 17:39:12
    static修饰符是一个能够减少此类命名冲突的有用工具。...因此,如果若干个函数需要共享一组外部对象,可以将这些函数放到一个源文件中,把它们需要用到的对象也都在同一个源文件中以static修饰符声明。 static修饰
  • C语言中 static修饰函数

    千次阅读 2008-05-12 13:57:00
    static修饰函数意义是:该函数只在该模块内部可见!因为在C中,函数是外部的。即不管是写在哪个文件里的函数,在其它文件里都是可见的。 为了限制一个函数仅在一个源文件里可见,可用static指示符。 不想C++语言,...
  • C语言--static修饰函数

    千次阅读 2013-08-06 10:02:18
    在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,...
  • static修饰函数叫做静态函数,静态函数有两种,根据其出现的地方来分类: **如果这个静态函数出现在类里,那么它是一个静态成员函数;** 静态成员函数作用在于:调用这个函数不会访问或者修改任何对象(非...
  • static修饰局部变量 局部变量是出现在局部范围(代码块内部)的变量,它的生命周期只能在定义代码的代码块内部有意义,出代码块就会被销毁。我们来看个例子。 void test() { int a = 1;//无stati...
  • static修饰的局部变量的作用域并不会改变,只是生命周期会随着整个程序运行结束而结束。 局部变量和静态局部变量的区别: 使用static修饰局部变量的方法:在局部变量前面加static关键字,例如:static int a; ...
  • static作用修饰函数、局部变量、全局变量)

    万次阅读 多人点赞 2018-12-09 20:52:50
    C语言:static作用修饰函数、局部变量、全局变量) 一、 static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。  全局变量本身就是静态存储方式, ...
  • static修饰函数,本限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。 在函数的返回类型前加上关键字static,函数就被定义...
  • c语言static函数声明和函数定义 都在.c文件 都要加static修饰
  • static修饰符:static变量,static函数

    千次阅读 2008-09-19 15:08:00
    static有两种用途:一是修饰变量,二是修饰函数 第一:修饰变量例子:static int a;void Func(){ static int b;}全局变量默认的存储类型是extern,若不加static修饰,在不同头文件中定义名字相同的全局变量会发生...
  • 文章目录static相关语法一、static 修饰变量修饰局部变量修饰全局变量修饰类中变量内存初始化时机二、static修饰函数修饰普通函数:全局静态函数修饰类中的函数:静态成员函数三、static修饰类对象 static相关语法 ...
  • C语言:static作用修饰函数、局部变量、全局变量) 一、 static全局变量与普通的全局变量有什么区别 ?  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。  全局变量本身就是静态存储...
  • const修饰的函数: ...static修饰函数没有this指针,与const的用法冲突。 但可以使用static和const修饰成员。 例子如下: class Singleton { public: static const Singleton* getInstance() { return...
  • JAVA_SE基础——35.static修饰成员函数

    千次阅读 2015-10-02 00:28:40
    在Java中适用static关键字修饰的方法称为静态方法。 声明静态方法的语法格式如下: 权限修饰static 数据类型 方法名(){ 方法体 } 静态方法 可以使用类名直接调用 类名.方法名() 1:静态函数中不能访问非静态...
  • ...在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。...(1)先来介绍它的第一条也是最重要的...当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这
  • static修饰的变量及函数

    千次阅读 2014-11-08 11:10:23
    在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。 (1)先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为...
  • (1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; (2)限制变量的作用域,在模块内的static全局变量可以被...
  • C++中的static数据成员/成员函数表示属于一个类... 在这里面, static既不是限定作用域的, 也不是扩展生存期的作用, 而是指示变量/函数在此类中的唯一性. 这也是”属于一个类而不是属于此类的任何特定对象的变量和
  • 一句话总结:static修饰的变量和函数是有可见范围的,一般情况下不要越限处理。 利用可在本文件调用的属性,另加一个函数fun,fun调用该static函数;其他文件调用fun即可 数只能在本文件中调用,其他文件想调用...
  • 1. static关键字的使用形式:static可以用作函数和变量的前缀,用以修饰变量,函数,数据成员,成员函数。(1)在C/C++中,修饰变量或函数:如,static int a; // 静态变量 static get_a(){ return a;} // 静态函数...
  • static作用修饰函数、局部变量、全局变量) 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。 (1)先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加...
  • static修饰的变量与函数说明

    千次阅读 2014-11-26 14:01:24
    static变量和static函数 static关键字有两种意思 1,表示变量是静态存储变量  表示变量存放在静态存储区.  2,表示该变量是内部连接  (这种情况是指该变量不在任何{}之内,就象全局变量那样,这时候加上static)  ,...
  • C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数...但当一个成员为static的时候,该函数是没有this指针的。也就是说此时const的用法和static是冲突的。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 234,736
精华内容 93,894
关键字:

static修饰函数的作用