iOS開發分分鐘搞定C語言 巨集定義和關鍵字

2021-07-05 14:53:39 字數 4263 閱讀 7689

一、巨集定義

概念:巨集定義實質是乙個預編譯指令,在程式未執行之前將某些指令付給相應的變數。一般情況預處理指令都是以#號開頭的,所以巨集定義也是以#開頭,關鍵字為#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檔案其實是乙個目錄,在子目錄中...