亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C 语言存储类详解:作用域、生命周期与四大类型实战

存储类定义 C 程序中变量和/或函数的作用域(可见性)和生命周期。它们位于所修饰类型之前。C 程序有四种存储类:

auto 存储类

auto 是所有局部变量的默认存储类。

{
    int mount;
    auto int month;
}

上例在同一存储类中定义两个变量。'auto' 只能用于函数内,即局部变量。

register 存储类

register 存储类用于定义应存储在寄存器而非 RAM 中的局部变量。这意味着变量最大尺寸等于寄存器大小(通常一个字),不能对其应用一元 '&' 运算符(因无内存位置)。

{
    register int miles;
}

register 仅用于需快速访问的变量如计数器。注意定义 'register' 不保证变量存储在寄存器,仅表示可能根据硬件和实现限制存储在寄存器中。

static 存储类

static 存储类指示编译器在程序生命周期内保持局部变量存在,而非每次进入/离开作用域时创建销毁。因此,将局部变量设为 static 可使其在函数调用间保持值。

static 修饰符也可用于全局变量。此时将变量作用域限制在声明它的文件内。

C 编程中,static 用于全局变量时,导致该成员仅有一份副本被其类所有对象共享。

在线演示
#include <stdio.h>
/* 函数声明 */
void func(void);
static int count = 5; /* 全局变量 */
main() {
    while(count--) {
        func();
    }
    return 0;
}
/* 函数定义 */
void func(void) {
    static int i = 5; /* 局部静态变量 */
    i++;
    printf("i is %d and count is %d\n", i, count);
}

编译执行产生以下结果:

i is 6 and count is 4
i is 7 and count is 3
i is 8 and count is 2
i is 9 and count is 1
i is 10 and count is 0

extern 存储类

extern 存储类用于提供所有程序文件可见的全局变量引用。使用 'extern' 时变量不能初始化,但将变量名指向先前定义的存储位置。

多文件共享全局变量或函数时,在其他文件用 extern 提供已定义变量或函数的引用。理解上,extern 用于在另一文件声明全局变量或函数。

extern 修饰符最常用于两个或更多文件共享同一全局变量或函数,如下所示。

第一文件:main.c

#include <stdio.h>
int count;
extern void write_extern();
main() {
    count = 5;
    write_extern();
}

第二文件:support.c

#include <stdio.h>
extern int count;
void write_extern(void) {
    printf("count is %d\n", count);
}

此处 extern 在第二文件声明 count,定义在第一文件 main.c。编译这两文件:

$gcc main.c support.c

生成可执行程序 a.out。执行产生以下结果:

count is 5

C语言

  1. 槽数如何影响铣刀性能
  2. C++结构体与类:嵌入式开发者实战指南
  3. 现代企业云存储十大核心价值:从灾备到协作的全维度赋能
  4. C++类与对象:面向对象编程实战指南
  5. C++ 友元函数与友元类:突破访问控制的利器
  6. C 语言存储类完全解析:auto、extern、static、register
  7. C++存储类别全解析:auto/register/static/extern/mutable作用域与生命周期
  8. C++接口编程:抽象类与纯虚函数实现规范契约
  9. C# 类完全指南:定义、封装、构造函数、析构函数与静态成员
  10. Python str.count() 完全指南:统计字符与子串出现次数实战
  11. Python list.count() 专家指南:语法、示例与性能解析
  12. 精通 Java:理解对象、类与核心 OOP 概念