我在C代码的不同地方看到过静态这个词;这是否像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库中,所有“私有”函数都是静态的,而大多数“公共”函数不是静态的。

其他回答

静态在不同的语境中有不同的含义。

你可以在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 someFunction(char arg[static 10])
{
    ...
}

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

这取决于:

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库中,所有“私有”函数都是静态的,而大多数“公共”函数不是静态的。

一个静态变量值在不同的函数调用之间持续存在,它的作用域被限制在本地块 静态变量的初始值总是0