常见的全局变量定义

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指针

参考链接

以上是关于常见的全局变量定义的主要内容,如果未能解决你的问题,请参考以下文章

如何定义常量在全局范围内nodejs

C++初级static用法总结问题探讨及常见错误排查

环境变量与全局变量

postman环境变量和全局变量

常见C语言知识要点

总结了一些指针易出错的常见问题