关于函数名前加static的一些解释
遇到有函数名前有加static的函数,不太懂什么意思。上网查了一下,网上有两种说法.现复制整理了一下,有兴趣的可以看一下
说法一:
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。定义静态函数的好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突
<2> 静态函数不能被其他文件所用。
存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。 auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。
C语言中使用静态函数的好处:
静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。
关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
c语言中static的语义
1.static变量:1).局部a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。2).全局全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
2.static函数(也叫内部函数)只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可以用来修饰变量,也可以用来修饰函数。先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含对,不要弄混。
说法二:
为什么不自己去实践呢?
在C里面,所谓 static ,只是限制在当前源文件————这个只是对于编译器/链接器而言。但实际上,运行时,static和普通的extern 的函数/变量,没有区别。
例如:使用函数指针/变量指针,完全可以访问其他文件的 static 变量/函数
file01.h
int * iptr01;
typedef void (* funcPtr)(void);
funcPtr pfun01;
----------------------------file01.c
#include "file01.h"
static int ivar01 = 36;
int * iptr01 = &ivar01;static void hwfun (void);
funcPtr pfun01 = &hwfun;void hwfun (void)
{
printf("hello world\n");
}
-------------------------file02.c
#include "file01.h"
............
//在某个代码内
*iptr01 = 72;
//file01.c 中的ivar01 变为72;
pfun01();
//调用了file01.c 中的hwfun ,打印出hello world
个人感觉说法二比较对,说法一也为我们普及了许多知识
关于函数名前加static的一些解释相关推荐
- 函数名前加static与不加static的区别
函数名前有无static关键词修饰的区别 引入 static修饰特点 代码示例 代码1(对应第1点) 代码2(对应第2点) 代码3(对应第3点) 总结 引入 在定义函数时,前面有时会有static关键 ...
- 函数名前加static的作用
static 先思考一个问题,static修饰一个变量的作用是什么? 它的名字叫做局部静态变量或者全局静态变量,那这个变量到底可以干什么? 它有一个作用就是为了让该变量只在自己的编译单元中可见.对于外 ...
- php 调用变量方法名,php中引用(变量和函数名前加符号)用法
本文章来给大家介绍在php中我们常看到在在php变量前面加个&符号,这个就是php中引用符号了,它可以用于各种变量.函数.对象了下面我来给各位详细介绍php&符号用法.在 PHP 中引 ...
- 函数名前加::的缘由
函数名前加::的缘由 在开发MFC之前,自己开发的是以AFx(ApplicationFrameworks,x是没有什么意义的)开头的一些函数.但是那个时候开发的函数并没有进行封装,但是有很多很有用的函 ...
- 调用函数时为什么要在函数名前加“(void)”
我们知道,在定义函数时,加在函数名前的"void"表示该函数没有返回值.但在调用时,在函数名前加"(void)"的作用又是什么呢? 最明显的一点就是表示程序并不 ...
- 调用函数时在函数名前加“(void)”
在定义函数时,加在函数名前的"void"表示该函数没有返回值.但在调用时,在函数名前加"(void)"的作用又是什么呢? 最明显的一点就是表示程序并不关心调用该 ...
- 函数名前加 符号的深入理解 C++
#include <iostream>using namespace std;int& test_str() {int a = 1;return a; //通过返回 a 的地址来进 ...
- 在C++中,函数名前的const和函数名后的const的区别
首先要知道函数名后面加const只能用于成员函数. int const func(); //合法,相当于const int func(); int func2() const; //非法,对函数的co ...
- C++ 函数名前的 '', 参数前的
函数名前的 '&' 可以让你用 &函数名() 的方式获取返回值的地址 传参时候,参数para1 前面加&,在函数内改变para1 的值,函数外的para1 也会变,否则不变
最新文章
- jwt token长度限制_ASP.NET Core Web Api之JWT(一)
- python补全插件
- ways to talk with girls
- c语言绘制路面图形代码,道路纵断面绘图程序的开发.pdf
- C#开源类库推荐:拼多多开放平台SDK,开源免费,支持.NET Core!
- 计算机桌面上的声音图标没了怎么办,Win7电脑右下角声音图标不见了怎么办?...
- python面试题及答案2020_2020年python面试题汇总(最新)
- python math模块详解
- cmd操作 以及几个常用快捷键
- 网络抖动、丢音、卡顿
- python根据出生年份计算年龄_python根据出生日期计算年龄的代码详解
- 龙芯CPU处理器和芯片资料介绍
- Mysql eighth week
- hdwiki 数据库结构说明
- 计算机毕业设计选题建议
- 计算机教师培训感悟反思,教学工作反思感悟
- 计算机类英文自我介绍,优秀的计算机专业英文自我介绍
- 净值继续回落,短期弱势难改
- 征服多云管理的6种工具
- 高斯-克吕格投影与UTM投影