Objective-C中的const extern static用法

extern

下面的代码声明了一个全局变量,它用于告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要在其它文件内查找!”

extern int a;//声明一个全局变量a

请确保该变量已经在其它文件内定义!

如果该变量没有在其他文件中定义,编译器会报错。

比如,在某版本的 Xcode 下,会有如下报错:

Undefined symbols for architecture arm64:
  "_b", referenced from:
      -[AppDelegate application:didFinishLaunchingWithOptions:] in AppDelegate.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code  (use -v to see invocation)

const

const 关键字指定变量的值是常量,并通知编译器防止程序员修改它。

当我们尝试直接修改时,编译器会报错❗️。比如下面的代码在Xcode 8 中,会提示Cannot assign to variable 'const_i' with const-qualified type 'const int'

const int const_i = 10;
const_i = 20;

程序运行时,对 const 关键字指定的变量�进行修改的行为是未定义(undefined)的,它主要由编译器所决定。

static

在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。
静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的。
静态变量都在全局数据区分配内存。

static NSString *name;
name = @"酷酷的哀殿";
NSLog(@"%p", name);

NSString *nameba = @"酷酷的哀殿";
NSLog(@"%p", &nameba);

NSString *nameb = @"酷酷的哀殿";
NSLog(@"%p", &nameb);

静态变量和局部变量的地址并不在同一个区域

0x1000ec070
0x16fd1a1f8
0x16fd1a1f0

下面两种全局变量声明的区别是,如果多个文件内存在同名变量,int a会导致duplicate symbol _a

static int a;  

int a;

其它用法

定义外部使用的常量。

为了方便让外部使用变量,推荐使用以下方法

 //在.h文件内进行如下声明
FOUNDATION_EXTERN NSString *const kSUNName;
//或
UIKIT_EXTERN NSString *const kSUNName;

 并在.m文件内定义

NSString *const kSUNName = @"酷酷的哀殿";

请注意,这里不能添加static修饰符。用static修饰后,将不能提供外界访问。比如下面的写法:

static const NSString *SUNName = @"酷酷的哀殿";

在其他地方使用会报错

Undefined symbols for architecture arm64:
  "_SUNName", referenced from:
      -[AppDelegate application:didFinishLaunchingWithOptions:] in AppDelegate.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

扩展知识

但是,当我们通过 extern 关键字重新声明其它文件内的变量时,编译器会忽略原先的关键字。所以,我们可以通过下面的方法修改可以取消报错❗️。

//A文件
const int sun_i = 10;
const int * const sun_j = &sun_i;

//B文件
extern int sun_i;
extern int *sun_j;

*sun_j = 100;
printf("%d",sun_i);
    原文作者:酷酷的哀殿
    原文地址: https://www.jianshu.com/p/9acc22b84bc6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞