C语言中`static`关键字的含义

C语言中static关键字的含义

技术背景

在C语言编程中,static关键字是一个重要的声明说明符,它主要用于控制变量和函数的存储、作用域和链接属性。理解static关键字的不同使用场景和作用,对于编写高效、安全且易于维护的C代码至关重要。

实现步骤

1. 函数内部的静态变量

在函数内部声明的静态变量,在函数的多次调用之间会保留其值。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

void foo()
{
int a = 10;
static int sa = 10;

a += 5;
sa += 5;

printf("a = %d, sa = %d\n", a, sa);
}


int main()
{
int i;

for (i = 0; i < 10; ++i)
foo();
}

上述代码中,变量a是普通的局部变量,每次调用foo函数时都会重新初始化;而sa是静态变量,只会在第一次调用foo函数时初始化,之后每次调用都会保留上一次的值。程序的输出结果如下:

1
2
3
4
5
6
7
8
9
10
a = 15, sa = 15
a = 15, sa = 20
a = 15, sa = 25
a = 15, sa = 30
a = 15, sa = 35
a = 15, sa = 40
a = 15, sa = 45
a = 15, sa = 50
a = 15, sa = 55
a = 15, sa = 60

2. 静态全局变量和函数

静态全局变量和函数的作用域仅限于声明它们的文件。以下是一个多文件的示例:

a.c

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

extern int i;
static int si = 0;

void a() {
i++;
si++;
puts("a()");
printf("i = %d\n", i);
printf("si = %d\n", si);
puts("");
}

main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

int i = 0;
static int si = 0;

void a();

void m() {
i++;
si++;
puts("m()");
printf("i = %d\n", i);
printf("si = %d\n", si);
puts("");
}

int main() {
m();
m();
a();
a();
return 0;
}

在这个示例中,全局变量imain.ca.c中是共享的;而静态全局变量si在每个文件中是独立的,其他文件无法访问。

3. 函数参数中的静态数组声明

在C语言中,static还可以用于函数参数的数组声明,指定数组的最小元素个数。示例如下:

1
void func(int foo[static 42]);

上述代码表示func函数接受一个至少包含42个元素的整数数组作为参数。

核心代码

函数内部静态变量示例

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

void counter() {
static int count = 0;
count++;
printf("Count: %d\n", count);
}

int main() {
counter();
counter();
return 0;
}

静态全局变量和函数示例

file1.c

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

static int private_var = 10;

static void private_func() {
printf("Private function called.\n");
}

void public_func() {
private_func();
printf("Public function called, private_var: %d\n", private_var);
}

file2.c

1
2
3
4
5
6
7
8
#include <stdio.h>

extern void public_func();

int main() {
public_func();
return 0;
}

最佳实践

  • 使用静态局部变量:当函数需要在多次调用之间保留某些状态,且不希望使用全局变量时,可以使用静态局部变量。但要注意,这种用法可能会使代码的线程安全性降低,应谨慎使用。
  • 使用静态全局变量和函数:在实现某些功能的.c文件中,将不需要暴露给外部的变量和函数声明为静态的,以实现封装,提高代码的安全性和可维护性。

常见问题

1. 静态变量的初始化问题

静态变量如果没有显式初始化,会自动初始化为0。例如:

1
2
3
4
5
6
7
#include <stdio.h>

int main() {
static int x;
printf("x = %d\n", x);
return 0;
}

上述代码中,x会被初始化为0。

2. 静态变量的链接错误

如果在多个文件中定义了同名的非静态全局变量,链接时会出现错误。而静态全局变量由于其作用域仅限于声明它们的文件,不会出现此类问题。

3. C++与C中static的差异

在C++中,static除了具有C语言中的用法外,还可以用于定义类的静态成员变量和成员函数,这些成员为类的所有对象共享。而C语言中没有类的概念,因此不存在这种用法。


C语言中`static`关键字的含义
https://119291.xyz/posts/the-meaning-of-static-in-c/
作者
ww
发布于
2025年7月17日
许可协议