static,const,extern,以及全局常量

1:全局常量的定义:1:创建Header头文件,再创建与Header头文件类名相同的空文件作为.m文件,.h文件引用文件,.m文件负责定义常量

1 #import <UIKit/UIKit.h>
2 
3 UIKIT_EXTERN const CGFloat XMGRed;
4 UIKIT_EXTERN const CGFloat XMGGreen;
5 UIKIT_EXTERN const CGFloat XMGBlue;
6 UIKIT_EXTERN const CGFloat XMGAlpha;
7 UIKIT_EXTERN const int XMGAge;
8 UIKIT_EXTERN NSString * const XMGName;
#import <UIKit/UIKit.h>

const CGFloat XMGRed = 0.4;
const CGFloat XMGGreen = 0.6;
const CGFloat XMGBlue = 0.7;
const CGFloat XMGAlpha = 1.0;
const int XMGAge = 20;
NSString * const XMGName = @"jack";

补充:1:若无法识别CGFloat结构体,则引入头文件,

#import <UIKit/UIKit.h>

2:.m文件中定义的常量,用const修饰代表常量。其中const CGFloat a = 10.f; 和 CGFloat const a = 10.f;两种写法是一样的,都代表a值为常量,不可修改,但是外部可通过extern CGFloat a;引用该变量,若无const,则通过extern引用a后也可修改。全局变量若只想被该文件所持有,不希望被外界引用,则用static修饰,也就是static  const  CGFloat a = 10.f;和 static  CGFloat  const a = 10.f;是一样的,注意只有全局变量用static修饰时,才只被该文件所持有,外界不可引用。

const CGFloat XMGRed = 0.4;定义一个常量,若是全局变量,则可被外界引用,但不能修改

3:定义不可变字符串时:用 static NSString * const name = @"JACK";则指针name不可变,外界不可以给该变量赋值。其中const修饰可变与不可变,就看const右边修饰的是什么 例如:NSString * const name = @"JACK",则代表指针name不可变,*name可变,若NSString  const  * name = @"JACK",则 *name不可变,指针name可变

4:UIKIT_EXTERN:其实就是extern,最好加上const,来告诉外界这个引用变量不可改变。

UIKIT_EXTERN const CGFloat XMGRed;

5:宏定义 与 static const 修饰的全局常量的区别:一般项目中尽量避免使用大量的宏定义,因为每一个宏定义都会在内存中临时开辟一份内存空间,而static const 修饰的常量 ,则只会开启一份内存空间,其使用效果和宏定义相同,建议以后项目开发中定义常量时,多用 static const 来代替宏定义


原文地址:https://www.cnblogs.com/cqb-learner/p/5716565.html