static 函数定义在头文件中有什么作用

static 函数定义在头文件中有什么作用?学渣求教,static 不就是要限制作用域吗?

7个回答

是限定范围的,你的理解没有错。所以在 .h 中定义的 static 函数只能供本头文件中定义的函数使用

SnackWOLF
带着儿子打酱油 我写代码测试,可以用,但是他们不是一个函数,同static 变量类似,那我想问一下这么用的主要目的是什么,是一些常用函数用起来方便?
5 年多之前 回复
SnackWOLF
带着儿子打酱油 回复91program:
5 年多之前 回复
91program
91program 回复带着儿子打酱油: 如下的代码,确实是可以调用的。但函数不像变量,就算函数的地址不一样,但功能是一样的、且不能修改的。
5 年多之前 回复
SnackWOLF
带着儿子打酱油 那他定义在头文件中,我只要包含头文件就可以使用该函数了,是不是想定义在头文件中的变量一样?每个.c文件使用包含在头文件中的函数都不是同一个函数?这样理解对吗
5 年多之前 回复
SnackWOLF
带着儿子打酱油 那他定义在头文件中,我只要包含头文件就可以使用该函数了,是不是想定义在头文件中的变量一样?每个.c文件使用包含在头文件中的函数都不是同一个函数?这样理解对吗
5 年多之前 回复

static表示静态类型。同时限定在模块内可见。

oyljerry
oyljerry 回复带着儿子打酱油: 是模块,而不是函数,当然同一个模块内部,不同函数可以访问全局静态变量
5 年多之前 回复
SnackWOLF
带着儿子打酱油 ???
5 年多之前 回复
SnackWOLF
带着儿子打酱油 我写代码测试,可以用,但是他们不是一个函数,同static 变量类似,那我想问一下这么用的主要目的是什么,是一些常用函数用起来方便
5 年多之前 回复
oyljerry
oyljerry 回复带着儿子打酱油: 就是你类似理解的,c文件就是一个模块
5 年多之前 回复
SnackWOLF
带着儿子打酱油 那他定义在头文件中,我只要包含头文件就可以使用该函数了,是不是想定义在头文件中的变量一样?每个.c文件使用包含在头文件中的函数都不是同一个函数?这样理解对吗?限定在模块内采纳如何理解?谢谢 说的具体点
5 年多之前 回复

我来回答一下吧。

static限定函数的时候,和普通函数没有很大的区别的。这里说的函数不是成员函数,而且定义在头文件中!
唯一的区别就是,在调用该函数的时候,static函数在内存中只维持一份,而普通函数每次调用都会维持一份拷贝。
当然这个静态函数也可以在其他文件中调用了!只是要包含它所在的头文件了。

而对于那些总是说不可以在其它文件中使用的人,你写代码尝试了吗?还是只看课本拷贝呢?

weixin_41075120
weixin_41075120 终于有一个靠谱的回答了,上面那些人真是误人子弟
大约 2 年之前 回复
SnackWOLF
带着儿子打酱油 回复Heart09: 谢谢
5 年多之前 回复
henuyx
Heart09 回复带着儿子打酱油: 还有一个好处是,在头文件中定义,多次引用该头文件,不会出现重复定义的,且能保证其他文件调用该函数速度很快,用来输出一些统计信息还是很不错的选择的。如果涉及的计数和多线程,还是要加锁的应该。
5 年多之前 回复
henuyx
Heart09 回复带着儿子打酱油: (个人观点)如果说用于统计的话,无需将函数static,只需在函数中定义一个static变量即可。但是可以看出来有一个好处,就是速度快!因为在内存中只维持一份,不用拷贝。最后呢,这个时候可能会存在一些潜在问题,比如多线程的时候,两个线程交叉的调用该函数,是不是会出现一些不可预计的问题呢?这个需要写代码测试一下。
5 年多之前 回复
SnackWOLF
带着儿子打酱油 我写代码测试,可以用,但是他们不是一个函数,同static 变量类似,那我想问一下这么用的主要目的是什么,是一些常用函数用起来方便。
5 年多之前 回复

static用于声明静态变量,添加了该标识意味着这个变量的值在整个程序运行期间都存在的

91program
91program 提问者关注的是 static 函数,你回答的是 static 变量。
5 年多之前 回复

static是静态变量.局部变量.其作用域是从定义点到return.定义范围从定义点到程序结束.

C语言中static关键字的作用
【1】static作用的变量
1.static修饰全局变量:在全局变量前加static,全局变量就被定义成为一个全局静态变量。
特点如下:
1)存储区(内存中的位置):静态存储区没变(静态存储区在整个程序运行期间都存在);
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0。(自动对象的值是任意的,除非他被显示初始化)
3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。好处:

1)不会被其他文件所访问,修改;
2)其他文件中可以使用相同名字的变量,不会发生冲突。

2.static修饰局部变量:在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。特点如下:
1) 存储区(内存中的位置):由栈变为静态存储区rodata,生存期为整个源程序,只能在定义该变量的函数内使用。退出该函数后,尽管该变量还继续存在,但不能使用它;
2)初始化:为静态局部变量赋初值是在编译时进行的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而为自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用函数重新给一次值,相对于执行一次赋值语句。如果在定义局部变量是不赋初值的话,对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量)。而对自动变量来说,如果不赋初值,则它的值是不确定的值。这是由于每次函数调用结束后存储单元已被释放,下次调用时又重新分配存储单元,而所分配的单元中的值是不确定的。
3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束,尽管该变量还继续存在,但不能使用它。

【2】static作用的函数
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。好处:
1)其他文件中可以定义相同名字的函数,不会发生冲突
2)静态函数不能被其他文件所用。

http://blog.csdn.net/yunfenglw/article/details/39804237

如下的代码,确实是可以调用的。但函数不像变量,就算函数的地址不一样,但功能是一样的、且不能修改的。
所以,对于函数来说,是一样的。

 #ifndef _TEST_STATIC_FUNC_H_
#define _TEST_STATIC_FUNC_H_

static int giStTest = 0;
static void IsCanBeCalledBySource(int iTest)
{
    printf("%d\r\n",iTest);
    return;
}

#endif

#include "stdafx.h"
#include "TestStaticFunc.h"

int _tmain(int argc, _TCHAR* argv[])
{
    giStTest = 0;
    IsCanBeCalledBySource(giStTest);

    return 0;
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐