這里介紹一下define、const、extern的用法、優劣以及要注意的地方。
1.define
宏define是定義一個變量,沒有類型信息。define定義的常量在內存中有若干個拷貝。
define可以定義常量,但是建議不要這么做,因為用define定以了的常量,其值可以改變。
用define定義方法和變量的例子:
#define MAX(a,b) (a>b)?a:b
#define MYVALUE 10
2.const
const修飾的變量是不可變的。
const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而#define定義的常量在內存中有若干個拷貝。
編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。
注意下面的const的用法:
static const int kCount = 1; //此處定義的kCount后面都不能改變值,如果改變,則報錯 static const NSString *kStr1 = @"alun1";//此處定義的kStr1可修改其值,但是修改過后他們的內存地址一樣。 static NSString const *kStr1 = @"alun1";//跟上面的定義寫法不同,但是結果一樣 static NSString* const kStr2 = @"alun2";//此處定義的kStr2不能改變,否則會發生錯誤
根據上面的解析,可以知道,const定義的右邊的是不可以改變的,也就是說const修飾的是它右邊的部分。
//打印 kStr1 的內存地址,都是相同的地址fasoeio NSLog(@"內存地址: %x",&kStr1); kStr1 = @"alun1_alun1"; NSLog(@"內存地址: %x",&kStr1);
3.extern
extern用來修飾全局變量。extern用在變量聲明中常常有這樣一個作用,你在*.c文件中聲明了一個全局的變量,這個全局的變量如果要被引用,就放在*.h中並用extern來聲明。。
.h頭文件中聲明
//.h文件中 extern NSString *const kName;
.m實現文件中賦值
//.m文件中 NSString *const kName = @"Alun Chen";