【杂谈】C语言中的链接属性、声明周期以及static关键字

目录

一、变量链接属性与生命周期的问题

1.链接属性(内部、外部、无修饰)

1)外部extern示例

2)无修饰符示例

2.作用域

3.生命周期

二、static关键字的两大作用

1.将函数或全局变量链接属性从external修改为internal

2.将变量存储区域从栈区迁移到静态区


一、变量链接属性与生命周期的问题

1.链接属性(内部、外部、无修饰)

一个变量的链接属性有external(外部)、internal(内部)、none(无)

  • 使用static修饰.c文件创建的全局变量,该变量只能在本.c文件内使用
  • 没有任何修饰的全局变量默认具有external属性,因此在同一个工程不同的文件中可以使用
  • 在源文件中创建全局变量,最好在头文件中使用extern修饰源文件创建的全局变量(只给出声明不赋值,这样就不会额外开辟空间),该变量将具有外部链接属性,可被其他文件使用,且其他文件中不要起同名的全局变量,这样在使用时位于不同源文件的同名变量在使用时都将指向同一个实体,不会发生报错

1)外部extern示例

复制代码
/******************* AAA.c文件 *******************/
int a = 10;

/******************* AAA.h文件 *******************/
extern int a;

/******************* BBB.c文件 *******************/
extern int a;                            //正常使用

/******************* main.c文件 *******************/
extern int a;                            //正常使用

2)无修饰符示例

复制代码
/******************* AAA.c file *******************/
int a = 10;

/******************* BBB.c file *******************/
int a = 100;

/******************* main.c文件 *******************/
extern int a;      //报错,因为不知道到底指向哪一个实体            

/******************* AAA.c文件 *******************/
int a = 10;

/******************* AAA.h文件 *******************/
extern int a;

/******************* BBB.c文件 *******************/
int a = 100;

/******************* main.c文件 *******************/
extern int a;      //报错,因为不知道到底指向哪一个实体 

小结:

  • 想要变量被外部使用,就在.c中创建实体,在.h中给出声明并用extern修饰
  • 想要变量只在源文件内部使用和修改,就在.c创建的实体中用static修饰
  • 如果确定变量只在本文件内使用最好使用static修饰,以防止多个实体冲突的问题

2.作用域

  • 具有external属性的变量作用域为整个工程

  • 大作用域的变量可以覆盖到所有比自己小的作用域

  • 如果大作用域的变量遇到小作用域的变量,小作用域变量将在小作用域内优先被使用

    int a = 10; //作用域在整个工程

    void F1()
    {
    int i = 0; //作用域仅在此函数内
    for( i = 0; i < 10; i++ )
    {
    a++; //a最终为20
    }

    }

    void F2()
    {
    int i = 0; //作用域仅在此函数内
    int a = 80; //此处的a将代替全局变量a进行后续的运行
    for( i = 0; i < 10; i++ )
    {
    a++; //a最终为90
    }
    }

3.生命周期

不论是main.c还是其他.c文件,所有全局变量都被存储在静态区,因此它们的生命周期直到程序运行结束才结束

二、static关键字的两大作用

1.将函数或全局变量链接属性从external修改为internal

对于某一个源文件中的一些函数或全局变量想将其限制在本源文件内而不想被外部使用,使用 static 将其进行修饰即可

2.将变量存储区域从栈区迁移到静态区

特别地,使用 static 无论是修饰全局变量还是局部变量,都会将该变量的存储空间从栈区迁移到静态区,存储在静态区的变量即使在退出函数之后依旧会保留当前的值,生命周期直到程序结束为止

相关推荐
APIshop15 小时前
淘宝商品评论接口实战解析:从抓包到数据抓取全链路技术指南
java·python
阿珊和她的猫15 小时前
Chrome 的 SameSite 属性:原理与解决方案
前端·chrome
百锦再15 小时前
线程安全的单例模式全方位解读:从原理到最佳实践
java·javascript·安全·spring·单例模式·kafka·tomcat
belldeep15 小时前
nodejs: 能在线编辑 Markdown 文档的 Web 服务程序,更多扩展功能
前端·node.js·markdown·mermaid·highlight·katax
程序员林北北15 小时前
【前端进阶之旅】一种新的数据格式:TOON
前端·javascript·vue.js·react.js·typescript·json
木斯佳15 小时前
前端八股文面经大全:2026-01-23快手AI应用方向前端实习一面面经深度解析
前端·人工智能·状态模式
百锦再15 小时前
Java synchronized关键字详解:从入门到原理(两课时)
java·开发语言·struts·spring·kafka·tomcat·maven
油丶酸萝卜别吃15 小时前
什么是 Java 内存模型(JMM)?
java·开发语言
量子炒饭大师16 小时前
【C++入门】Cyber神经的义体插件 —— 【类与对象】内部类
java·开发语言·c++·内部类·嵌套类
Hx_Ma1616 小时前
测试题(四)
java·开发语言·jvm