常见的全局变量定义
Posted zcube
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见的全局变量定义相关的知识,希望对你有一定的参考价值。
常见的全局变量定义
作用域在文件内全局常量
// 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指针
参考链接
以上是关于常见的全局变量定义的主要内容,如果未能解决你的问题,请参考以下文章