static关键字的最全用法
有错误请友好评论指出,查阅后会改正,谢谢。
C语言中static关键字的最全用法
前言
static 就像一本仙级修仙功法
被修饰的对象就像修炼了该功法的 只诞生一次的 重复转世且保留记忆的拥有 龟息大法特性圆满的与当世天地同寿的 修仙者
。
一、简单介绍一下:C语言中的static是什么?
在 C 语言中,关键字(也称为保留字)是一组具有特殊含义的标识符,它们被编程语言的语法所保留,用于定义语言的结构和命令。
关键字不能用作变量名、函数名或其他标识符的名字,因为它们已经被语言本身使用了。
常见的关键字有:static 、 sizeof 、 return 、 volatile 、 break 、 const 等
而其中的static关键字可以对变量或函数的生命周期、作用域和初始化造成影响 static直译是静态、静止 简说作用差不多就是 该变量或函数只一次初始化、作用域私有且长命。
二、使用场景
1. static修饰局部变量
void count()
{
static int counter = 0; // 修饰一个整型局部变量为静态局部常量
counter++;
printf("Counter: %d\n", counter);
}
主要使用场景:
递归计数器 等需要保持其值的重复运算。
避免全局变量污染,只对特定函数可见,同时又希望它能跨越多次函数调用保持其值时。
静态局部变量作为多线程中线程自己独立的全局变量。
生命周期:
静态局部变量在程序启动时被创建,即使函数执行完毕后,静态局部变量仍然保持其值。并在整个程序运行期间一直存在,直到程序结束时才被销毁。
初始化:
静态局部变量只能初始化一次,
在程序开始执行之前,如果没有显式地初始化,它会被自动初始化为0(对于数值类型)或空指针(对于指针类型)。
作用域:
尽管静态局部变量的生命周期延长了,但它的作用域并没有改变,依然是局部于定义它的函数或代码块内。也就是说,除了定义它的函数外,其他地方(包括函数main)无法访问这个变量。
#include <stdio.h>
void count()
{
static int counter = 0;
counter++;
printf("Counter: %d\n", counter);
}
int main()
{
for (int i = 0;i < 10; i++)
{
count();
}
return 0;
}
输出
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter: 6
Counter: 7
Counter: 8
Counter: 9
Counter: 10
2.static修饰全局变量
static int global_Static_Var = 10; // 修饰静态全局变量
void printGlobalStatic() {
printf("Value of static global variable in file1: %d\n", global_Static_Var ); //打印
}
主要使用场景:
限制全局变量的作用域。
生命周期:
与普通的全局变量一样,静态全局变量也具有整个程序运行期间的生命周期。也就是说,从程序开始执行直到结束,静态全局变量一直存在。
初始化:
静态全局变量只初始化一次,
在程序开始执行之前,如果没有显式地初始化,它会被自动初始化为0(对于数值类型)或空指针(对于指针类型)。
作用域:
当一个全局变量被声明为static时,它的作用域将限制在定义它的源文件内。其他源文件即使包含了这个文件的头文件也无法访问到这个静态全局变量。这种方式有助于封装数据,防止不同模块之间的直接依赖。
假设我们有两个源文件 File1.c 和 File2.c 以及一个公共头文件 common.h。
File1.c
#include "common.h"
static int global_Static_Var = 10; // 修饰静态全局变量
void printGlobalStatic() {
printf("Value of static global variable in file1: %d\n", global_Static_Var ); //打印
}
common.h
#ifndef COMMON_H
#define COMMON_H
void printGlobalStatic();
#endif
File2.c
#include <stdio.h>
#include "common.h"
// 尝试访问File1.c中的静态全局变量会失败
// extern int globalStaticVar; // 这行会导致链接错误
int main() {
// printGlobalStatic(); // 如果函数原型已正确声明,则可以调用
// printf("Trying to access globalStaticVar from File2: %d\n", global_Static_Var ); // 编译错误
return 0;
}
3.static修饰函数
#include <stdio.h>
static void printHello() { // 静态函数
printf("Hello from file1!\n");
}
void publicFunction() {
printHello(); // 可以在本文件中调用静态函数
}
主要使用场景:
限制函数的作用域。
生命周期:
与普通的函数一样,静态函数也具有整个程序运行期间的生命周期。
声明:
修饰之后不需要在头文件中声明
作用域:
与静态全局变量类似,静态函数的作用域仅限于定义它的源文件内。如果在一个源文件中定义了一个静态函数,那么这个函数不能被其他源文件中的代码直接调用。这种限制有助于隐藏实现细节,减少命名冲突,并提高程序的模块化程度。
由于静态函数的作用域被限定在单个文件内,因此可以在不同的源文件中使用相同名称的函数而不会产生冲突。每个文件中的同名静态函数都是独立的,互不影响。
总结
以上就是今天的关于常见的C语言static关键字的研究复习笔记。