我在C代码的不同地方看到过静态这个词;这是否像c#中的静态函数/类(实现是跨对象共享的)?


当前回答

我讨厌回答一个老问题,但我认为没有人提到K&R在“C编程语言”的A4.1节中是如何解释它的。

简而言之,“static”一词有两层含义:

静态是两个存储类之一(另一个是 自动)。静态对象在调用之间保持其值。在所有块外声明的对象总是静态的,不能自动的。 但是,当静态关键字(强调它被用于 代码作为关键字)与声明一起使用,它提供了该对象的内部链接,因此它只能在该翻译单元中使用。但是如果在函数中使用关键字,它将改变对象的存储类(无论如何,对象只在该函数中可见)。与static相对的是extern关键字,它提供对象外部链接。

Peter Van Der Linden在“Expert C Programming”中给出了两个含义:

在函数内部,在调用之间保留其值。 在函数级,仅在此文件中可见。

其他回答

我讨厌回答一个老问题,但我认为没有人提到K&R在“C编程语言”的A4.1节中是如何解释它的。

简而言之,“static”一词有两层含义:

静态是两个存储类之一(另一个是 自动)。静态对象在调用之间保持其值。在所有块外声明的对象总是静态的,不能自动的。 但是,当静态关键字(强调它被用于 代码作为关键字)与声明一起使用,它提供了该对象的内部链接,因此它只能在该翻译单元中使用。但是如果在函数中使用关键字,它将改变对象的存储类(无论如何,对象只在该函数中可见)。与static相对的是extern关键字,它提供对象外部链接。

Peter Van Der Linden在“Expert C Programming”中给出了两个含义:

在函数内部,在调用之间保留其值。 在函数级,仅在此文件中可见。

需要注意的是,函数中的静态变量在第一次进入该函数时被初始化,并且即使在调用结束后仍然存在;对于递归函数,静态变量只初始化一次,并且在所有递归调用中持续存在,甚至在函数调用结束后仍然存在。

如果变量是在函数外部创建的,则意味着程序员只能在声明变量的源文件中使用该变量。

这里还有一种用法没有涉及,它是数组类型声明的一部分,作为函数的参数:

int someFunction(char arg[static 10])
{
    ...
}

在这个上下文中,它指定传递给这个函数的参数必须是char类型的数组,其中至少有10个元素。更多信息请看我的问题。

从维基百科:

在C编程语言中,static与全局变量和函数一起使用,以将它们的作用域设置为包含文件。在局部变量中,static用于将变量存储在静态分配的内存中,而不是自动分配的内存中。虽然语言没有规定这两种类型内存的实现,但静态分配的内存通常在编译时保留在程序的数据段中,而自动分配的内存通常作为瞬态调用堆栈实现。

如果在静态函数中声明变量,其值将不会存储在函数调用堆栈中,并且在再次调用该函数时仍然可用。

如果将全局变量声明为static,则其作用域将限制在声明它的文件内。这比常规的全局变量稍微安全一些,后者可以在整个程序中读取和修改。