常见的全局变量定义

本文详细介绍了全局变量的定义和作用域,包括文件内的全局常量和工程级别的全局常量。强调了const关键字的用法,解释了const修饰指针和指针修饰const的区别,并讨论了static如何限制变量的作用域。extern用于在不同文件间共享全局变量,防止重复定义的问题。同时,文中提供了C语言中const*和*const的用法示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见的全局变量定义

作用域在文件内全局常量

// Test.m
static NSString *const kTestKey = @"test_key"; // 只作用于当前Test.m文件

作用域在工程的全局常量

// Test.h
extern NSString *const kTestKey;

// Test.m
NSString *const kTestKey = @"test_key"; // 作用于整个工程,在需要用到该变量的地方包含Test.h头文件即可

注意

  • 定义变量永远都不应该出现在头文件中,因为如果被包含多次,就会出现变量重定义错误。
  • 头文件中只能出现包含extern关键字的变量声明。

关键字解读

const

  • NSInteger const a = 3;
  • const NSInteger a = 3;

上面两种写法是等效的因为 NSInteger const 等价于 const NSInteger。

  • const NSString *str = @"abc";
  • NSString const *str = @"abc";
  • NSString *const str = @"abc"; // 正确写法

同样,上面第一种和第二种写法是等效的,项目中如果出现前两种写法,大多都不是符合预期的写法,因为str的值依然可以改变。

第三种写法才符合要使用的const的预期,这时候不允许再给str赋值。因为 NSString const * 表示指向 NSString const 的指针,NSString *const 表示指向 NSString 的const指针。

指针被声明为const后,将不允许被重新赋值,否则会编译错误。

static

static除了声明变量为静态变量外,还有一个作用,就是声明作用域在文件内的全局变量。

下面代码声明kTestKey为作用域在当前文件的全局变量:

  • static NSString *const kTestKey = @"test_key";

如果不加static,则表示kTestKey为作用域在整个工程的全局变量。假如工程中其它地方也定义了相同的kTestKey全局变量,就会出现变量重复定义编译失败问题。

extern

如果在Test.m文件中定义了如下全局变量:

  • NSString *const kTestKey = @"test_key";

那么就应该在Test.h文件中进行如下声明,表示该全局变量已经被定义过了:

  • extern NSString *const kTestKey;

如果工程其它位置需要用到kTestKey全局变量,则在.m文件中包含Test.h文件即可(也可以不包含Test.h,直接在.m文件中extern声明就可以使用,但是这样不便于管理)。

C语言中的 const* 和 *const

  • int* - 指向int的指针
  • int const * - 指向const int的指针
  • int * const - 指向int的const指针
  • int const * const - 指向const int的const指针

const放在类型两边是等价的,所以:

  • const int * 等价于 int const *
  • const int * const 等价于 int const * const

下面是一段测试代码:

// const int *a
int b = 1;
const int *a = &b;
int c = 2;
a = &c;
*a = 3; // 编译失败,因为a是指向const int的指针

// int *const a
int b = 1;
int *const a = &b;
int c = 2;
a = &c; // 编译失败,因为a是指向int的const指针
*a = 3;

// const int *const a
int b = 1;
const int *const a;
int c = 2;
a = &c; // 编译失败,因为a是指向const int的const指针
*a = 3; // 编译失败,因为a是指向const int的const指针

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值