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

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

我来回答一下吧。

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

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

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

 #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;
}

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

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

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

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

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