
在C语言中,静态声明用于限定限制为已编译源文件的其余部分. 通过静态限制外部对象,可以达到隐藏外部对象的目的. 如果将一个函数声明为静态类型c 类 static 函数,则除该函数声明所在的文件外,无法访问该函数名. 也就是说,只能由该文件中的函数调用它,而不能由同一程序中其他文件中的函数调用.
可以将
C程序视为由一系列外部对象组成,这些对象可以是变量或函数. 内部变量是指函数参数和在函数内部定义的变量. 外部变量在函数外部定义,因此可以在许多函数中使用. 由于C不允许在一个函数中定义其他函数,因此该函数本身只能是“外部”.
由于C语言代码是由文件组织的,因此在源程序的所有源文件中,只能在某个文件中定义一次外部变量或函数,并且可以通过extern声明访问其他文件(源文件定义外部变量或函数的外部变量也可以包含该外部变量的extern声明.
并且static可以将变量或函数限制为静态存储. 如果使用static来限定限定为已编译源文件的其余部分. 通过静态限制外部对象,可以达到隐藏外部对象的目的. 因此,静态限定的变量或函数不会与同一程序中其他文件中的相同名称发生冲突. 如果使用static限定内部变量,则该变量将从程序开始就拥有内存,并且不会在调用和退出函数时分配和消失.
在C语言中使用静态函数的好处:
1)静态函数会自动分配到一个存储区中,该存储区一直使用到退出应用程序实例为止,这避免了在调用函数时将堆栈从堆栈中推出,这会更快.
2)关键字“静态”(翻译为中文)为“静态”,因此内部函数也称为静态函数. 但是,“静态”的含义不是指存储方法,而是意味着功能范围仅限于此文件. 使用内部函数的优点是,当不同的人编写不同的函数时,他们不必担心他们定义的函数是否与另一个文件中的函数具有相同的名称,因为相同的名称无关紧要.

补充1: 静态变量
C / C ++中的变量根据范围(知道名称的程序的文本区域)和生存期(生存期)分为全局变量,静态全局变量,局部变量和静态局部变量在程序执行过程中对象存在的时间.
使用关键字static声明局部变量,该变量是静态局部变量. 静态局部变量的特征在于它位于静态存储区域中,并且其生存期是整个程序执行周期. 函数调用结束后,其值仍然存在,并可能影响下一个调用的过程. 但是它的范围仅限于定义变量的函数.
全局变量是静态存储. 静态全局变量当然是静态存储. 但是,它们的范围是不同的. 非静态全局变量的范围是整个源程序(可以共同使用多个源文件). 而静态全局变量限制了它的范围,也就是说,它仅在定义了该变量的源文件中有效,不能在同一源程序的其他源文件中使用.
问题: 对静态的理解
对于静态变量,请选择所有正确的变量:
A. 如果仅在单个C文件中访问全局变量,则可以将此变量修改为静态全局变量,以减少模块之间的耦合;
B. 如果仅通过单个函数访问全局变量,则可以将此变量更改为函数的静态局部变量,以减少模块之间的耦合;

C. 在设计和使用访问动态全局变量,静态全局变量和静态局部变量的函数时,您需要考虑可重入性;
D. 静态全局变量太大,但这会导致堆栈溢出.
答案和分析:
对于D: 静态变量放置在程序的全局数据区域中,不在堆栈上分配,因此不可能导致堆栈溢出,并且D是错误的.
答案是A,B,C.
问题: 不可重入功能
我曾经设计过以下功能,由于该功能不是可重入的,因此在代码检查期间收到了错误通知. 为什么?
无符号整数sum_int(无符号整数基数)

{
无符号整数索引;
静态无符号整数和= 0; //请注意,它是静态类型.
for(索引= 1;索引<=基数;索引++)
{
sum + = index;
}
返还金额;

}
答案和分析:
所谓的函数是可重入的(也是可预测的)c 类 static 函数,也就是说,只要输入数据相同,就应该产生相同的输出.
该函数不可预测的原因是因为该函数中使用了静态变量. 由于静态变量的特性,此类函数称为: 具有“内部存储器”功能的函数. 因此,如果需要可重入函数,则必须避免在函数中使用静态变量. 在此类函数中使用静态变量的原则是,应尽可能避免使用它们.
将以上函数修改为可重入函数非常简单. 只要删除了声明和变量中的static关键字,该变量和就成为自动类型变量,并且该函数成为可重入函数.
当然,在某些情况下,必须在函数中使用静态变量. 例如,当函数的返回值是指针类型时,局部变量的地址必须是静态的作为返回值. 如果是自动类型,则返回错误的指针.
补充2: C ++静态成员
要求成员提供整个类的所有对象,而不是对象. 同时,它努力不破坏类的封装,也就是说,该成员必须隐藏在类内部并且对外部不可见,并且静态成员可以是私有成员. 每个静态数据成员都是与类相关联的对象,而不是该类的对象.
静态成员的优点:
1)静态成员的名称在类的范围内,因此可以避免与其他类或全局对象的成员名称发生冲突.
2)可以实现封装. 静态成员可以是私有成员,而全局对象则不能.
3)从读者容易看出,静态成员与特定类相关联. 这种可见性清楚地表明了程序员的意图.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-148780-1.html
人渣一个说