const,static和extern講解

講解前先說下三個詞的意思
const 常量
static 靜態(tài)
extern 查找引用

在項目中我們經(jīng)常會用到宏定義,例如#define ANIMATION_DURATION 0.5.嗯,這么寫很方便,但是殊不知它也是有缺點的,比如說:宏定義僅僅是簡單的值替代,缺乏類型檢查機制,不包含類型信息,嵌套過多會影響程序的可讀性,降低代碼的可讀性,并且容易出錯,導(dǎo)致程序崩潰.那么我們該如何避免因為過多的使用宏定義導(dǎo)致可能出現(xiàn)的問題呢?答案是用全局常量去取代宏定義.
const CGFloat kAnimationDuration = 0.5;,這么寫和宏的作用相同,而且不能對kAnimationDuration的值進行修改,保證了數(shù)據(jù)的準(zhǔn)確性(const保證了值不被修改)
但是這就存在一個問題,定義一個全局常量,其實是可以在整個程序中都能訪問的,方法就是用extern關(guān)鍵字(在其他的項目文件中使用extern CGFloat kAnimationDuration;,這樣就可以直接獲取到其他文件中定義的全局常量來進行使用),默認情況下,全局常量是不安全的,因為用extern就可以在其他文件進行修改.

若不想被其他文件使用kAnimationDuration的值,或者為了避免造成值污染,就用到了static關(guān)鍵字(聲明kAnimationDuration的時候在最前面加static,static const CGFloat kAnimationDuration = 1;).也就是說使用static以后,創(chuàng)建的全局常量只能在本文件使用了,其他文件是訪問不到的.

那么我們再反過頭來說一下這個extern CGFloat kAnimationDuration;,通過這個獲取到的其他文件中的常量的值,可是試一下,竟然是可以進行更改的,而且編譯不會報錯,但是運行試一下,擦,崩潰了.所以為了程序安全,為了避免獲取到的這個變量被我們不經(jīng)意間更改而導(dǎo)致崩潰,我們需extern const kAnimationDuration;,也就是多加了了一個const,使獲取到的變量變成常量,我們獲取的值也就不能再進行修改了.

然后我們再去進行具體分析下const和static

分析之前我們需要先對指針的內(nèi)容復(fù)習(xí)下

int a = 10;
    int *p = &a;
    *p = 20;    //a = 20
    int b = 30;
    p = &b;
    *p = 40;    //b = 40;

下面開始關(guān)于const的研究

const int *p = NULL;//這里的*p不能進行更改,但是p可以進行更改
int const *p = NULL;//效果同上
int const p;      //p可以更改,*p不能更改
const int p;     //效果同上
int *const p = NULL; //*p可以改,但是p不能進行更改
我們可以得出的結(jié)論是,其實主要看的是const的右邊是什么,右邊是p,則p不能進行修改,右邊是*p,則 *p不能進行修改.

下面開始關(guān)于static的研究

//寫一個循環(huán)
for (int i = 0; i < 3; i++) {
        test();
    }

void test(){
    //1.修飾局部變量
    //加了static后,讓局部變量只初始化一次,局部變量在內(nèi)存中只有一份內(nèi)存
    //不會改變局部變量的作用域,只會改變其生命周期(直到程序結(jié)束,這個局部變量才會被銷毀)
    static int a = 0;
    a++;
    NSLog(@"%d",a);  //依次輸出1,2,3
}

//2.修飾全局變量
    //當(dāng)多個文件都定義了同一個全局變量,當(dāng)用extern去進行引用的時候,會導(dǎo)致崩潰
    //此時,用static就可以把全局變量限制在本文件使用
    //所以全局變量建議加static

等等,講了這么多,好像和最前面將的全局常量代替宏定義有點關(guān)系不大啊,跑題了有點,哈哈哈.那么回到正題,如果每次使用都要用extern去引用的話,那豈不是每個文件都要extern一大堆的垃圾代碼嗎?所以,我最后要說的是我們可以創(chuàng)建一個空的類,來專門進行生命和實現(xiàn)這些代碼,和frefixheader文件一樣.

// .h文件
extern CGFloat const animationDuration;
// .m文件
static const CGFloat animationDuration = 0.5f;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辰企,一起剝皮案震驚了整個濱河市斟珊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趴泌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件老翘,死亡現(xiàn)場離奇詭異吼砂,居然都是意外死亡,警方通過查閱死者的電腦和手機穴豫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逼友,“玉大人精肃,你說我怎么就攤上這事≈钠颍” “怎么了司抱?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長黎烈。 經(jīng)常有香客問我习柠,道長,這世上最難降的妖魔是什么照棋? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任资溃,我火速辦了婚禮,結(jié)果婚禮上烈炭,老公的妹妹穿的比我還像新娘肉拓。我一直安慰自己,他們只是感情好梳庆,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卑惜,像睡著了一般膏执。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上露久,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天更米,我揣著相機與錄音,去河邊找鬼毫痕。 笑死征峦,一個胖子當(dāng)著我的面吹牛迟几,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播栏笆,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼类腮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛉加?” 一聲冷哼從身側(cè)響起蚜枢,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎针饥,沒想到半個月后厂抽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡丁眼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年筷凤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苞七。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡藐守,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莽鸭,到底是詐尸還是另有隱情吗伤,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布硫眨,位于F島的核電站足淆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏礁阁。R本人自食惡果不足惜巧号,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姥闭。 院中可真熱鬧丹鸿,春花似錦、人聲如沸棚品。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铜跑。三九已至门怪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锅纺,已是汗流浹背掷空。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坦弟。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓护锤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酿傍。 傳聞我的和親對象是個殘疾皇子烙懦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • static 修飾局部變量 1.讓局部變量只初始化一次 2.局部變量在程序中只有一份內(nèi)存 3.并不會改變局部變量的...
    千尋_544f閱讀 2,339評論 0 0
  • const,static,extern簡介一、const與宏的區(qū)別(面試題):const簡介:之前常用的字符串常量...
    BinaryRo閱讀 254評論 0 1
  • 一拧粪、const與宏的區(qū)別: const簡介:之前常用的字符串常量修陡,一般是抽成宏,但是蘋果不推薦我們抽成宏可霎,推薦我們...
    一頭奔跑的牛閱讀 284評論 0 1
  • 在項目中绢记,我們經(jīng)常全局用到一些常量,那么這些常量在項目中怎么管理呢正卧?看完這篇文章相信蠢熄,讀者應(yīng)該不在迷惑了。 文章展...
    7dfa9c18c1d1閱讀 820評論 5 2
  • ——不奢談夢想炉旷,那過于清高签孔,只求能胡思亂想,把天花亂墜當(dāng)作最后一根稻草窘行。 有時饥追, 我想把全世界的聲音都收集起來, ...
    像風(fēng)的夢閱讀 412評論 0 0