const static和extern關鍵字

2021-07-12 05:21:55 字數 3464 閱讀 1913

一、巨集定義

概念:巨集定義實質是乙個預編譯指令,在程式未執行之前將某些指令付給相應的變數。一般情況預處理指令都是以#號開頭的,所以巨集定義也是以#開發,關鍵字為#define(定義巨集定義),#undef(結束巨集定義)。

定義格式及作用域

一般巨集定義都定義在程式的首段: #define 巨集名 值。

巨集定義的作用域:從開始定義的那行起,一直到檔案末尾,雖然預設情況下巨集定義的作用域是從定義的那一行開始, 一直到檔案末尾。但是我們也可以通過對應的關鍵字#under提前結束巨集定義的作用域。

巨集定義規範

一般情況巨集名都大寫, 多個單詞之間用_隔開, 並且每個單詞全部大寫,並寫在程式的頭部。 

有的公司又要求巨集名以k開頭, 多個單詞之間用駝峰命名 

注意: 

巨集定義後面不要用分號。

ios開發中巨集定義使用場景

獲取螢幕的寬度 

獲取手機系統版本號 

做乙個單例 

判斷系統版本 

·························· 

帶引數的巨集定義

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.定義結構體型別的同時, 給結構體型別起別名, 並且省略掉原有型別的名稱 

typedef struct 

sperson;

糾結的const(static) 和 define

const static 和 define 在開發中常用來定義常量,這樣做的好處是 使 更易維護 提高 的效率。1 const static const是c c 中的乙個關鍵字 修飾符 const一般用來定義乙個常量,既然叫做常量,即以後再也不能修改其值。const 定義常量時,編譯器通常不為普通c...

const static變數存放位置

我們將以下面的例子介紹const變數和static變數的存放位置 static int val a 1 初始化的靜態變數 int val b 2 全域性變數 const int val c 3 const 全域性變數 static int val d 未初始化的靜態變數 int val e 未初始化...

C 疑難問題 const static

關鍵字const 指定用其宣告的內容保持不變 1.標識變數 代替 define來宣告常量 const doble pi 3.14159 2.標識方法 標識類方法,可以防止方法修改類中不可變的資料成員 class.h class a class.cpp int getvalue const 3.con...