extern与static的区别与使用

本文讲述了extern关键字用于声明全局变量,其区别于static,以及在头文件中正确声明和定义函数/变量的重要性,包括避免重复定义和内存共享的问题。
摘要由CSDN通过智能技术生成

extern

  • 被修饰的函数或变量的作用域是整个程序

  • 函数或全局变量的声明默认是extern

  • extern一般用于声明一个变量,如果是定义则不需要加此关键字,否则会提示warning

  • extern只用于声明,不带extern修饰的全局变量,是对变量的定义(初始化为默认值),所以当明确声明语义时,就要加上extern修饰,否则会出现重复定义的错误,如:

    extern int a; // 声明了一个全局变量
    int b;        // 声明并定义了一个全局变量,一般初始为0
    

static

  • static修饰的全局变量或函数的作用域是当前文件

  • 当不希望当前函数或全局变量被其他文件可见时,使用static

常见问题

1. 在头文件中声明extern函数或变量
  • 一定是在头文件中声明,源文件中去定义,否则当有多个源文件包含该头文件时,就会报重复定义的错误。

  • 如果必须要在头文件中声明并定义,请使用static修饰符。

  • extern修饰的全局变量,将在整个程序中被共享。

2. 在头文件中声明并定义static函数或变量
  • 当其他源文件包含该头文件时,会产生一个新的内存来存储静态的全局变量,即不与其他文件共享该变量。
3. extern的使用
  • 以下是头文件a.h

    extern int a; // 声明
    extern int func_a(); // 声明
    
  • 以下是源文件a.c

    #include "a.h"
    
    int a = 1; // 定义
    
    int func_a() // 定义
    {
        return 1;
    } 
    
  • 在源文件b.c中使用

    #include "a.h"
    
    // extern int a;        // 若不包含头文件a.h,则需要在此处声明
    // extern int func_a(); // 若不包含头文件a.h,则需要在此处声明
    
    int func_b() 
    {
        return func_a() + a;
    }
    
    • 使用a.c中的全局变量和函数时,有两种方式:

      1. 包含对应的头文件

      2. 在当前文件声明对应的变量和函数

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值