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


当前回答

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

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

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

   i++;
}

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

其他回答

这取决于:

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

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

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

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

C语言中的静态变量具有程序的生命周期。

如果在函数中定义,则它们具有局部作用域,即只能在这些函数中访问它们。静态变量的值在函数调用之间保留。

例如:

void function()
{
    static int var = 1;
    var++;
    printf("%d", var);
}

int main()
{
    function(); // Call 1
    function(); // Call 2
}

在上面的程序中,var存储在数据段中。它的生命周期是整个C程序。

函数调用1后,var变为2。函数调用2后,var变为3。

var的值不会在函数调用之间被销毁。

如果var在非静态变量和局部变量之间,它将被存储在C程序的堆栈段中。由于函数的堆栈帧在函数返回后被销毁,因此var的值也被销毁。

初始化的静态变量存储在C程序的数据段中,而未初始化的静态变量存储在BSS段中。

关于静态的另一个信息:如果一个变量是全局的并且是静态的,那么它具有C程序的生命周期,但是它具有文件作用域。它只在该文件中可见。

试试这个:

file1.c

static int x;

int main()
{
    printf("Accessing in same file%d", x):
}

file2.c

    extern int x;
    func()
    {
        printf("accessing in different file %d",x); // Not allowed, x has the file scope of file1.c
    }

run gcc -c file1.c

gcc -c file2.c

现在试着把它们连接起来:

gcc -o output file1.o file2.o

它会给出一个链接器错误,因为x的文件作用域是file1.c,而链接器将无法解析file2.c中使用的对变量x的引用。

引用:

http://en.wikipedia.org/wiki/Translation_unit_(编程) http://en.wikipedia.org/wiki/Call_stack

在C编程中,static是一个保留关键字,它控制生存期和可见性。如果我们在函数中将变量声明为静态变量,那么它将只在整个函数中可见。在这种用法中,该静态变量的生命周期将在函数调用时开始,并在函数执行后终止。示例如下:

#include<stdio.h> 
int counterFunction() 
{ 
  static int count = 0; 
  count++; 
  return count; 
} 

int main() 
{ 
  printf("First Counter Output = %d\n", counterFunction()); 
  printf("Second Counter Output = %d ", counterFunction()); 
  return 0; 
}

上面的程序会给我们这样的输出:

First Counter Output = 1 
Second Counter Output = 1 

因为一旦我们调用这个函数,它就会初始化count = 0。当我们执行counterFunction时,它会销毁count变量。

分享一下我对这一点的了解。

在C语言中static是一个声明说明符,它分为三类:

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

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

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

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