一、巨集定義
概念:巨集定義實質是乙個預編譯指令,在程式未執行之前將某些指令付給相應的變數。一般情況預處理指令都是以#號開頭的,所以巨集定義也是以#開頭,關鍵字為#define(定義巨集定義),#undef(結束巨集定義)。
定義格式及作用域
一般巨集定義都定義在程式的首段:#define 巨集名 值。
巨集定義的作用域:從開始定義的那行起,一直到檔案末尾,雖然預設情況下巨集定義的作用域是從定義的那一行開始, 一直到檔案末尾。但是我們也可以通過對應的關鍵字#under提前結束巨集定義的作用域。
巨集定義規範
一般情況巨集名都大寫, 多個單詞之間用_隔開, 並且每個單詞全部大寫,並寫在程式的頭部。
有的公司又要求巨集名以k開頭, 多個單詞之間用駝峰命名
注意:
巨集定義後面不要用分號。
ios開發中巨集定義使用場景
獲取螢幕的寬度
獲取手機系統版本號
做乙個單例
判斷系統版本
··························
帶引數的巨集定義
帶引數的巨集定義注意點:
1.一般情況下建議寫帶引數的巨集的時候, 給每個引數加上乙個()
2.一般情況下建議寫帶引數的巨集的時候, 給結果也加上乙個()
二、const關鍵字
const對基本資料型別的作用, 可以讓基本資料型別的變數變為常量。
const有兩種寫法,:
1.寫在資料型別的左邊
2.寫在資料型別的右邊
const的作用
(1)可以定義const常量,具有不可變性。
2)便於進行型別檢查,使編譯器對處理內容有更多了解,消除了一些隱患。
(3)可以避免意義模糊的數字出現,同樣可以很方便地進行引數的調整和修改。 同巨集定義一樣,可以做到不變則已,一變都變!
(4)可以保護被修飾的東西,防止意外的修改,增強程式的健壯性。
(5) 可以節省空間,避免不必要的記憶體分配。
(6) 提高效率。編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高。
如何使用const
1.修飾常指標:(面試常考)
const int *a; //const修飾指標,a可變,a指向的值不能被修改
int const *a; //const修飾指向的物件,a可變,a指向的物件不可變
int *const a; //const修飾指標a, a不可變,a指向的物件可變
const int *const a;//指標a和a指向的物件都不可變
修飾常指標的技巧
先看「*」的位置
如果const 在 *的左側 表示值不能修改,但是指向可以改。
如果const 在 *的右側 表示指向不能改,但是值可以改
如果在「*」的兩側都有const 標識指向和值都不能改。
2.修飾一般常量
修飾符const可以用在型別說明符前,也可以用在型別說明符後。
3.修飾常陣列
修飾常陣列(值不能夠再改變了)定義或說明乙個常陣列可採用如下格式:
int const a[5]=;
const int a[5]=;
const int a[5]=;
a[1] = 55; // 錯誤
4.修飾函式的常引數
修飾函式的常引數const修飾符也可以修飾函式的傳遞引數,格式如下: void fun(const int var); 告訴編譯器var在函式體中的無法改變,從而防止了使用者的一些無 意的或錯誤的修改。
5.修飾函式的返回值
修飾函式的返回值: const修飾符也可以修飾函式的返回值,是返回值不可被改變,格式如 下:
const int fun1();
const myclass fun2();
三、static和extern關鍵字
內部和外部函式
內部函式:只能在本檔案中訪問的函式。
外部函式:可以在本檔案中以及其他的檔案中訪問的函式。
預設情況下所有的函式都是外部函式。
static關鍵字
1.只要在函式的返回值前面加上static就可以讓函式變為內部函式, 其它檔案就不能訪問了。
2.如果static寫在函式的實現中, 代表定義乙個內部函式。
3.如果static寫在函式的宣告中, 代表宣告乙個內部函式
【面試】關鍵字static有三個明顯的作用:
1)在函式體內,乙個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變(該變數存放在靜態變數區)。
2) 在模組內(但在函式體外),乙個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是乙個本地的全域性變數。
3) 在模組內,乙個被宣告為靜態的函式只可被這一模組內的其它函式呼叫。那就是,這個函式被限制在宣告它的模組的本地範圍內使用。
extern關鍵字
1.只要在函式的返回值前面加上乙個extern就可以讓函式變為乙個外部函式, 由於預設就是外部函式, 所以在開發中一般情況extern沒人寫。
2.如果extern寫在函式的實現中, 代表定義乙個外部函式。
3.如果extern寫在函式的宣告中, 代表宣告乙個外部函式。
四、typedef 關鍵字
typedef可以給乙個已知的資料型別起別名 (外號),在ios開發中經常使用,所以必須掌握。
typedef的格式:
typedef 原有的資料型別 別名(外號);
typedef注意:
1. typedef不僅能給系統原有的資料型別起別名, 也可以給乙個自定義的資料型別起別名。
2. 利用typedef給資料型別起別名, 並不會生成乙個新的資料型別, 僅僅是給原有的型別起了乙個別名而已。
給列舉型別起別名
1.先定義列舉型別, 再給列舉型別起別名
enum gender
; typedef
enum gender ***;
2.定義列舉型別的同時給列舉型別起別名
typedef enum
gender
***;
3.定義列舉型別的同時給列舉型別起別名, 並且省略列舉原有型別名稱
typedef enum
***;
定義列舉變數有3種方式
1.先定義列舉型別, 再定義列舉變數
2.定義列舉型別的同時定義列舉變數
3.定義列舉型別的同時定義列舉變數, 並且省略列舉型別名稱
給結構體型別起別名
1.先定義結構體型別, 再給型別起別名
struct person
; // sperson == struct person
typedef
struct person sperson;
2.定義結構體型別的同時, 給結構體型別起別名
typedef
struct person
sperson;
3.定義結構體型別的同時, 給結構體型別起別名, 並且省略掉原有型別的名稱
iOS開發分分鐘搞定C語言 結構體和列舉
一 結構體 在前面的陣列分享中,把同一型別的資料進行儲存通過陣列,我們可以用陣列來表示這個整體,但是陣列有個特點 內部的每乙個元素都必須是相同型別的資料。那麼如何通過乙個方式將不同型別的資料進行儲存呢?為此,c語言專門提供了一種構造型別來解決上述問題,這就是結構體,它允許內部的元素是不同型別的。二 ...
iOS崩潰堆疊符號化,定位問題分分鐘搞定!
最近一段時間,在跟開發者溝通過程中,蘿莉發覺有些開發者對ios的應用符號表還不是很清楚,除了諮詢關於符號表生成 配置的問題以外,對bugly崩潰分析需要配置符號表也存在疑問。在這裡,蘿莉就給大家分享下關於ios符號表的一些內容。首先,進行常識 腦補 注意 和.dsym成對出現,並且二者有相同的uui...
iOS崩潰堆疊符號化,定位問題分分鐘搞定!
最近一段時間,在跟開發者溝通過程中,蘿莉發覺大家對ios的應用符號表還不是很清楚,除了諮詢關於符號表生成 配置的問題以外,對bugly崩潰分析需要配置符號表也存在疑問。在這裡,蘿莉就給大家分享下關於ios符號表的一些內容。首先,進行常識 腦補 1.符號表是什麼?dsym檔案其實是乙個目錄,在子目錄中...