我在C代码的不同地方看到过静态这个词;这是否像c#中的静态函数/类(实现是跨对象共享的)?
当前回答
分享一下我对这一点的了解。
在C语言中static是一个声明说明符,它分为三类:
存储类:有四个类:auto, static, extern和register。 类型限定符:如关键字:const, volatile等。 类型说明符:如关键字:void, char, short, int等。
所以静态是一个存储类。它将确定C程序中每个变量的以下三个属性。
存储持续时间:指为变量分配内存和释放内存的时间。具有静态存储持续时间的变量,只要程序在运行,它就保持在相同的内存位置。 作用域:指程序文本中变量可以被访问的部分。静态变量具有文件作用域而不是块作用域。 链接:指程序的不同部分(或文件)可以共享变量的程度。如果一个静态变量是在一个块中声明的,那么它就没有链接。如果一个静态变量是在块外部声明的,那么它就有内部链接。内部链接使它可以在单个文件中访问。
静态存储类对变量有不同的影响,这取决于它是在块外部还是块内部声明的。需要具体情况考虑。
其他回答
如果你在mytest.c文件中声明这个:
static int my_variable;
那么这个变量只能从这个文件中看到。该变量不能导出到其他任何地方。
如果在函数内部声明,则每次调用该函数时,变量的值将保持不变。
静态函数不能从文件外部导出。因此,在*.c文件中,如果将函数和变量声明为静态,则隐藏了它们。
静态在不同的语境中有不同的含义。
你可以在C函数中声明一个静态变量。这个变量只在函数中可见,但它的行为像一个全局变量,因为它只初始化一次,并保留其值。在这个例子中,每次调用foo(),它都会输出一个递增的数字。静态变量只初始化一次。 Void foo () { 静态int I = 0; printf (" % d”,我);我+ + } static的另一种用法是在.c文件中实现一个函数或全局变量,但不希望它的符号在文件生成的.obj之外可见。如。 静态无效foo(){…}
需要注意的是,函数中的静态变量在第一次进入该函数时被初始化,并且即使在调用结束后仍然存在;对于递归函数,静态变量只初始化一次,并且在所有递归调用中持续存在,甚至在函数调用结束后仍然存在。
如果变量是在函数外部创建的,则意味着程序员只能在声明变量的源文件中使用该变量。
我讨厌回答一个老问题,但我认为没有人提到K&R在“C编程语言”的A4.1节中是如何解释它的。
简而言之,“static”一词有两层含义:
静态是两个存储类之一(另一个是 自动)。静态对象在调用之间保持其值。在所有块外声明的对象总是静态的,不能自动的。 但是,当静态关键字(强调它被用于 代码作为关键字)与声明一起使用,它提供了该对象的内部链接,因此它只能在该翻译单元中使用。但是如果在函数中使用关键字,它将改变对象的存储类(无论如何,对象只在该函数中可见)。与static相对的是extern关键字,它提供对象外部链接。
Peter Van Der Linden在“Expert C Programming”中给出了两个含义:
在函数内部,在调用之间保留其值。 在函数级,仅在此文件中可见。
静态变量有一个特性,即使在它们超出作用域后也能保存它们的值!因此,静态变量在以前的作用域中保留它们以前的值,而在新的作用域中不再初始化。
看看这个例子 静态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)
这些是我发现的主要问题,上面没有为新手解释!