我在C代码的不同地方看到过静态这个词;这是否像c#中的静态函数/类(实现是跨对象共享的)?
当前回答
函数中的静态变量在调用之间保持其值。 静态全局变量或函数只能在声明它的文件中“看到”
(1)对于新手来说是比较陌生的话题,所以这里有一个例子:
#include <stdio.h>
void foo()
{
int a = 10;
static int sa = 10;
a += 5;
sa += 5;
printf("a = %d, sa = %d\n", a, sa);
}
int main()
{
int i;
for (i = 0; i < 10; ++i)
foo();
}
这个打印:
a = 15, sa = 15
a = 15, sa = 20
a = 15, sa = 25
a = 15, sa = 30
a = 15, sa = 35
a = 15, sa = 40
a = 15, sa = 45
a = 15, sa = 50
a = 15, sa = 55
a = 15, sa = 60
这对于函数需要在调用之间保持某种状态,而又不想使用全局变量的情况很有用。但是要注意,这个特性应该非常谨慎地使用——它使您的代码不是线程安全的,而且更难理解。
(2)作为“访问控制”功能被广泛使用。如果你有一个实现某些功能的.c文件,它通常只向用户公开几个“公共”函数。其余的函数应该是静态的,这样用户就不能访问它们。这就是封装,一个很好的实践。
引用维基百科:
在C语言中,是静态的 与全局变量和 函数将其作用域设置为 包含文件。在局部变量中, Static用于存储变量 在静态分配的内存中 而不是自动分配 内存。而语言却没有 指定任意一种方法的实现 内存类型,静态分配 内存通常保留在数据中 编译时的程序段 时间,当自动 已分配内存正常 实现为一个瞬态调用堆栈。
回答你的第二个问题,它不像c#。
然而,在c++中,static也用于定义类属性(在同一类的所有对象之间共享)和方法。在C语言中没有类,所以这个特性无关紧要。
其他回答
静态变量有一个特性,即使在它们超出作用域后也能保存它们的值!因此,静态变量在以前的作用域中保留它们以前的值,而在新的作用域中不再初始化。
看看这个例子 静态int变量在程序运行时保留在内存中。当声明变量的函数调用结束时,普通变量或自动变量将被销毁。
#include<stdio.h>
int fun()
{
static int count = 0;
count++;
return count;
}
int main()
{
printf("%d ", fun());
printf("%d ", fun());
return 0;
}
这将输出:12
As 1保留在内存中,因为它被声明为静态
静态变量(如全局变量)如果没有显式初始化,则初始化为0。例如,在下面的程序中,x的值被打印为0,而y的值是垃圾。更多细节请参见此。
#include <stdio.h>
int main()
{
static int x;
int y;
printf("%d \n %d", x, y);
}
这将输出:0 (some_garbage_value)
这些是我发现的主要问题,上面没有为新手解释!
简单的回答……视情况而定。
静态定义的局部变量不会在函数调用之间丢失它们的值。换句话说,它们是全局变量,但作用域是定义它们的局部函数。 静态全局变量在定义它们的C文件之外是不可见的。 静态函数在定义它们的C文件之外是不可见的。
需要注意的是,函数中的静态变量在第一次进入该函数时被初始化,并且即使在调用结束后仍然存在;对于递归函数,静态变量只初始化一次,并且在所有递归调用中持续存在,甚至在函数调用结束后仍然存在。
如果变量是在函数外部创建的,则意味着程序员只能在声明变量的源文件中使用该变量。
函数中的静态变量在调用之间保持其值。 静态全局变量或函数只能在声明它的文件中“看到”
(1)对于新手来说是比较陌生的话题,所以这里有一个例子:
#include <stdio.h>
void foo()
{
int a = 10;
static int sa = 10;
a += 5;
sa += 5;
printf("a = %d, sa = %d\n", a, sa);
}
int main()
{
int i;
for (i = 0; i < 10; ++i)
foo();
}
这个打印:
a = 15, sa = 15
a = 15, sa = 20
a = 15, sa = 25
a = 15, sa = 30
a = 15, sa = 35
a = 15, sa = 40
a = 15, sa = 45
a = 15, sa = 50
a = 15, sa = 55
a = 15, sa = 60
这对于函数需要在调用之间保持某种状态,而又不想使用全局变量的情况很有用。但是要注意,这个特性应该非常谨慎地使用——它使您的代码不是线程安全的,而且更难理解。
(2)作为“访问控制”功能被广泛使用。如果你有一个实现某些功能的.c文件,它通常只向用户公开几个“公共”函数。其余的函数应该是静态的,这样用户就不能访问它们。这就是封装,一个很好的实践。
引用维基百科:
在C语言中,是静态的 与全局变量和 函数将其作用域设置为 包含文件。在局部变量中, Static用于存储变量 在静态分配的内存中 而不是自动分配 内存。而语言却没有 指定任意一种方法的实现 内存类型,静态分配 内存通常保留在数据中 编译时的程序段 时间,当自动 已分配内存正常 实现为一个瞬态调用堆栈。
回答你的第二个问题,它不像c#。
然而,在c++中,static也用于定义类属性(在同一类的所有对象之间共享)和方法。在C语言中没有类,所以这个特性无关紧要。
这取决于:
int foo()
{
static int x;
return ++x;
}
函数将返回1,2,3,等等——变量不在堆栈上。
a.c:
static int foo()
{
}
这意味着该函数仅在该文件中有作用域。因此a.c和b.c可以有不同的foo(),并且foo不会暴露给共享对象。所以如果你在ac中定义了foo你就不能从bc或其他地方访问它。
在大多数C库中,所有“私有”函数都是静态的,而大多数“公共”函数不是静态的。