static
简单来说,static关键字用于限制所修饰对象的生命周期和作用域
在了解这部分内容时,需要非常熟悉C语言的编译链接过程以及程序–>内存池的过程
静态变量
void myFunction() {
static int x = 0; // 静态局部变量
x++;
printf("%d\n", x);
}
通过static修饰后,变量x的生命周期持续整个程序运行期间,而不会随着函数的执行完毕被释放
变量x的值随函数被执行的次数而改变
静态函数
static void myStaticFunction() {
// 函数的实现
}
静态函数只能在当前文件中使用,不能在其他文件中调用。它们具有文件作用域
这种限制有助于隐藏函数的实现细节并避免与其他文件中的同名函数发生冲突
静态全局变量
static int globalVar = 10; // 静态全局变量
静态全局变量的作用域仅限于当前源代码文件,不能被其他文件访问。
这有助于限制全局命名空间的污染和避免命名冲突
静态成员变量
static int globalVar = 10; // 静态全局变量
在面向对象编程中,static 修饰的成员变量属于类而不是类的实例
静态成员变量在所有类的实例之间共享,而不是每个实例都有自己的副本
extern
在了解C语言编译链接以及程序内存池的基础上,结合以上对static关键字的介绍
在对多个源文件同时进行编译时,若全局变量或函数没有被static修饰限制
那么这些全局对象将被定义在公共数据段(global data segment),可以被所有源文件访问
声明外部全局变量
// 在文件A.c中声明外部全局变量
extern int globalVar;
// 在文件B.c中定义外部全局变量
int globalVar = 10;
使用 extern 可以在一个源代码文件中声明在其他源代码文件中定义的全局变量。这样,编译器就知道该变量是外部的,并且不会分配新的存储空间
声明外部函数
// 在文件A.c中声明外部函数
extern void myFunction();
// 在文件B.c中定义外部函数
void myFunction() {
// 函数的实现
}
extern 还可用于声明在其他源代码文件中定义的函数。这对于在多个文件中使用相同函数的情况非常有用
使用全局变量和函数
extern int globalVar;
extern void myFunction();
int main() {
globalVar = 20; // 使用外部全局变量
myFunction(); // 调用外部函数
return 0;
}
在一个源代码文件中使用 extern 声明的外部变量或函数后,你可以在该文件中使用它们,编译器会知道它们的定义在其他文件中