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


当前回答

静态变量是可以在函数中使用的特殊变量,它在调用之间保存数据,并且不会在调用之间删除数据。例如:

void func(void) {
    static int count; // If you don't declare its value, it is initialized with zero
    printf("%d, ", count);
    ++count;
}

int main(void) {
    while(true) {
        func();
    }
    return 0;
}

输出:

0, 1, 2, 3, 4, 5...

其他回答

人们总是说C语言中的“static”有两层含义。我提供了另一种看待它的方式,赋予它一个单一的含义:

对一个项目应用“static”会迫使该项目具有两个属性:(a)在当前范围外不可见;(b)它是持久的。

它似乎有两种含义的原因是,在C语言中,每个“static”可能应用的项都已经具有这两个属性之一,所以似乎这种特殊用法只涉及另一个。

例如,考虑变量。在函数外部声明的变量已经具有持久性(在数据段中),因此应用'static'只能使它们在当前作用域(编译单元)之外不可见。相反,在函数内部声明的变量在当前作用域(函数)之外已经具有不可见性,因此应用“static”只能使它们持久。

将“static”应用于函数就像应用于全局变量一样——代码必须是持久的(至少在语言中),所以只能改变可见性。

注意:这些注释只适用于C。在c++中,对类方法应用'static'是真正赋予关键字不同的含义。C99数组参数扩展也是如此。

在C语言中,static有两个含义,这取决于它的使用范围。在全局作用域中,当在文件级声明对象时,这意味着该对象仅在该文件中可见。

在任何其他作用域,它声明一个对象,该对象将在输入特定作用域的不同时间之间保留其值。例如,如果一个int在一个过程中被delcare:

void procedure(void)
{
   static int i = 0;

   i++;
}

在第一次调用过程时,'i'的值被初始化为零,并且在以后每次调用过程时保留该值。如果打印'i',它将输出一个0,1,2,3,…

如果你在mytest.c文件中声明这个:

static int my_variable;

那么这个变量只能从这个文件中看到。该变量不能导出到其他任何地方。

如果在函数内部声明,则每次调用该函数时,变量的值将保持不变。

静态函数不能从文件外部导出。因此,在*.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语言中static是一个声明说明符,它分为三类:

存储类:有四个类:auto, static, extern和register。 类型限定符:如关键字:const, volatile等。 类型说明符:如关键字:void, char, short, int等。

所以静态是一个存储类。它将确定C程序中每个变量的以下三个属性。

存储持续时间:指为变量分配内存和释放内存的时间。具有静态存储持续时间的变量,只要程序在运行,它就保持在相同的内存位置。 作用域:指程序文本中变量可以被访问的部分。静态变量具有文件作用域而不是块作用域。 链接:指程序的不同部分(或文件)可以共享变量的程度。如果一个静态变量是在一个块中声明的,那么它就没有链接。如果一个静态变量是在块外部声明的,那么它就有内部链接。内部链接使它可以在单个文件中访问。

静态存储类对变量有不同的影响,这取决于它是在块外部还是块内部声明的。需要具体情况考虑。