Cprogramming 简明教程

Static Keyword in C

What is static Keyword in C?

static keyword in Cstorage class 说明符之一,它具有基于使用上下文的不同含义。

static ”关键字用于声明静态变量和定义静态函数。当声明为 “static” 时,变量表示静态存储类。

static function 仅可在其中定义的程序文件中(具有 “.c” 扩展名)内使用。不能使用 “extern” 关键字将静态函数导入另一个文件。

Uses of static Keyword

以下是静态关键字的不同用法

  1. Static Local Variable :当一个局部变量使用静态关键字声明时,它的生存期将持续到程序结束,并保留函数调用之间的值。

  2. Static Global Variable :当一个全局变量使用静态关键字声明时,它只能在同一文件中访问。当您想要将全局变量作为其中声明的文件的私有全局变量时,它很有用。

  3. Static Functions :当函数声明为静态函数时,它的作用域将限制在声明函数的文件内。您不能在其他文件中访问该函数。

Static Variables (static Keyword with Variables)

When a variable is declared as static, it is initialized only once 。编译器会将变量保留到程序结束。 static variable 也用于存储应该在多个函数之间共享的数据。

以下是在静态变量方面需要注意的一些重要事项 −

  1. 编译器在计算机的主内存中为静态变量分配空间。

  2. auto 不同,静态变量初始化为零,而不是垃圾。

  3. 如果静态变量是在函数内声明的,那么在每次函数调用时都不会对其重新初始化。

  4. 静态变量具有局部作用域。

Example of static Keyword with Variables

在以下示例中,counter() 函数中的变量 “x” 被声明为静态。当第一次调用 counter() 函数时,它被初始化为 “0”。在每次后续调用中,它不会被重新初始化,而是保留较早的值。

#include <stdio.h>

int counter();

int main() {

   counter();
   counter();
   counter();
   return 0;
}

int counter() {
   static int x;
   printf("Value of x as it enters the function: %d\n", x);
   x++;
   printf("Incremented value of x: %d\n", x);
}

当你运行这段代码时,它将产生以下输出:

Value of x as it enters the function: 0
Incremented value of x: 1
Value of x as it enters the function: 1
Incremented value of x: 2
Value of x as it enters the function: 2
Incremented value of x: 3

静态变量类似于全局变量,因为它们都初始化为 0(对于数字类型)或 null pointers (对于 pointers ),除非显式分配。但是,静态变量的范围被限制为其中声明的函数或块。

Static Functions (static Keyword with Functions)

默认情况下,编译器将每个 function 视为全局函数。可以在程序内的任何地方访问它们。

如果在定义中以关键字“static”作为前缀,我们得到一个范围限于其对象文件(以“.c”扩展名保存的程序的编译版本)的静态函数。这意味着静态函数仅在其对象文件中可见。

可以在函数名称前放置关键字“static”来声明一个静态函数。

Example of static Keyword with Function (in Multiple Files)

使用 CodeBlocks IDE 打开一个控制台应用程序。添加两个文件“file1.c”和“main.c”。这些文件的内容如下−

file1.c ” 的内容 −

static void staticFunc(void) {
   printf("Inside the static function staticFunc() ");
}

main.c ” 的内容 −

#include <stdio.h>
#include <stdlib.h>

int main() {

   staticFunc();
   return 0;
}

现在,如果构建上述控制台应用程序项目,那么我们将收到一条错误,即“对 staticFunc() 的引用未定义”。这是因为函数 staticFunc() 是一个静态函数,它只在其对象文件中可见。

Example of static Keyword with Function (in the Same File)

以下程序演示了静态函数在 C 程序中的工作方式 −

#include <stdio.h>

static void staticFunc(void){
   printf("Inside the static function staticFunc() ");
}

int main(){

   staticFunc();
   return 0;
}

以上程序的输出如下:

Inside the static function staticFunc()

在上述程序中,函数 staticFunc() 是一个静态函数,用于打印“Inside the static function staticFunc()”。main() 函数调用 staticFunc()。此程序可以正确工作,因为静态函数仅从其自身的对象文件中调用。

Example of static Keyword with Multiple Functions

您可以在同一个对象文件中拥有多个静态函数,如下例所示 −

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// define the static function
static int square( int num){
   return num * num;
}

static void voidfn(){
   printf ("From inside the static function.\n");
}

static int intfn(int num2){
   return sqrt(num2);
}

int main(){

   int n1, val;
   n1 = 16;
   val = square(n1);	// Call voidfn static function

   printf("The square of the %d : %d\n", n1, val);
   voidfn();		// Call intfn static function
   val = intfn(n1);
   printf("The square root of the %d : %d\n", n1, val);

   return 0;
}

当你运行这段代码时,它将产生以下输出:

The square of the 16: 256
From inside the static function.
The square root of the 16: 4