static 和 extern 关键字详解

背景介绍

全局变量

  • 外部变量:定义的变量能被本文件和其他文件访问(默认情况下,所有的全局变量都是外部变量,不同文件中的同名外部变量,都代表着同一个变量)
  • 内部变量:定义的变量只能被本文件访问,不能被其他文件访问(不同文件中的同名内部变量,互不影响)

关键字介绍

  • static
    • 对变量的作用: 定义一个内部变量 ,使不同文件中的同名内部变量,互不影响; 通常用来声明一个只可以被本文件访问的变量;
    • 对函数的作用: 定义和声明一个内部函数 通常用来声明一个只可以被本文件访问和调用的函数;
  • extern
    • 对变量的作用: 声明一个外部变量, 通常用来声明一个可以被其他文件访问的变量;
    • 对函数的作用: 定义和声明一个外部函数(可以省略, 通常用来声明一个可以被其他文件调用的函数

static 用来修饰局部变量:

  • 延长局部变量的生命周期:程序结束的时候,局部变量才会被销毁
  • 并没有改变局部变量的作用域

使用方法

  1. 在函数中的用法
===============  aw_data.h  ===============
#include <stdio.h>

// - 声明alloc_aw_data这个函数, 表示 alloc_aw_data 是一个外部函数;
extern aw_data * alloc_aw_data(int size);

===============  aw_data.c  ===============
#include "aw_data.h"

// - 表示 alloc_aw_data 是一个外部函数; 只要调用这个函数, 那么就是调用这个函数; 
aw_data * alloc_aw_data(int size){
	// - 内部实现
}

// -  表示 write_bytes 是一个内部函数; 只有在这个文件内部调用这个函数时候, 才是write_bytes 的函数实现, 如果是其它文件调用这个函数, 并且其它文件有这个函数的定义, 那么就是另一个 write_bytes 的实现的调用了;
static void write_bytes(aw_data **awdata, const uint8_t *bytes, uint32_t count){
	// - 内部实现
}

  1. 变量中的应用一
===============  Person.h  ===============
#import <Foundation/Foundation.h>

// - 声明  kCellID 是一个外部变量, 此时任何一个包含了 Person.h的文件中 访问 kCellID的值都是  @"cell_ID";
extern NSString *const kCellID;

@interface Person : NSObject  @end

===============  Person.m  ===============
#import "Person.h"

// - 定义这个外部变量并为这个外部变量赋值
NSString *const kCellID= @"cell_ID";

@implementation Person  @end 
  1. 变量中的应用二
#import <Foundation/Foundation.h>
===============  Person.m  ===============
#import "Person.h"

// - 定义这个外部变量并为这个外部变量赋值
int  age = 10;

@implementation Person  @end 

#import <Foundation/Foundation.h>
===============  Animal.m  ===============
#import "Animal.h"

@implementation Animal 

- (void)eat {
	//  -此时这个 extern int  age 声明一个 int 类型的外部变量 age, 此时所有访问这age的变量都是 访问的 Person.m 中定义的同一个age变量;  如果此时改为 extern int  age1, 编译会报错, 所以这样写健壮性还是没有问题的.
	extern int  age; 
	NSLog(@"// - 李超群 console [log] ...%d", age);
}
 @end 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值