關鍵字extern
const
typedef
#define aad(x, y) (x + y)
#define max(x, y) ( (x > y) ? (x) : (y) )
void test()
int main()
#undef sum
printf("**在 %d 行\n", __line__);
printf("**編譯的時間%s %s\n", __date__, __time__);
printf("檔名 %s\n", __file__);
printf("函式名%s\n", __function__);
#ifdef 識別符號
程式段1
#else
程式段2
#endif
它的功能是:如果識別符號已被#define命令定義過,則對程式段1進行編譯;
否則對程式段2進行編譯。如果沒有程式段2(它為空),本格式中的#else可以沒有,#endif不可或缺
#include int main()
編譯的時候增加巨集:gcc -d_debug
#if 常量表示式
程式段1
#else
程式段2
#endif
它的功能是:如果常量表示式的值為真(非0),則對程式段1進行編譯;
否則對程式段2進行編譯。因此可以使程式在不同條件下編譯,完成不同的功能。
#include // window _win32
// linux __linux__
int main()
#elif (__linux__)
#else
#endif
#if 0
code
#endif
return 0;
}
#include #define sqr(x) printf ("the square of "#x" is %d \n", ((x)*(x)))
int main()
#include #define createfun(name1, name2)\
void name1##name2()\
createfun(my, function);
int main()
在區域性靜態變數前面加上關鍵字static,該區域性變數便成了靜態區域性變數。靜態區域性變數有以下特點:
(1)該變數在全域性資料區分配記憶體
(2)如果不顯示初始化,那麼將被隱式初始化為0
(3)它始終駐留在全域性資料區,直到程式執行結束
(4)其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束
在全域性變數前面加上關鍵字static,該全域性變數變成了全域性靜態變數。
全域性靜態變數有以下特點:
(1)在全域性資料區內分配記憶體
(2)如果沒有初始化,其預設值為0
(3)該變數在本檔案內從定義開始到檔案結束可見,即只能在本檔案內使用
在函式的返回型別加上static關鍵字,函式即被定義成靜態函式。
靜態函式有以下特點:
(1) 靜態函式只能在本原始檔中使用
(2) 在檔案作用域中宣告的inline函式預設為static
說明:靜態函式只是乙個普通的全域性函式,只不過受static限制,他只能在所在檔案內使用,不能在其他檔案內使用。
extern可置於變數或者函式前,以表示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數或函式時,在其它模組中尋找其定義。
const只是不能通過修飾的變數改變空間的值,不代表空間的值不能改變
一般變數是指簡單型別的唯讀變數。這種唯讀變數在定義時,修飾符const可以用在型別說明符前,也可以用在型別說明符後。例如:
int const i = 2;
const int i = 2;
定義或說明乙個唯讀陣列
int const a[5] = ;
const int a[5] = ;
const int * p; // p可變,p指向的物件不可變
int const * p; // p可變,p指向的物件不可變
int * const p; // p不可變,p指向的物件可變
const int * const p; // 指標p和p指向的物件都不可變
這裡給出乙個記憶和理解的方法:
先忽略型別名(編譯器解析的時候也是忽略型別名),我們看const離哪個近,離誰近就修飾誰。
const (int) *p //const 修飾*p,p是指標,*p是指標指向的物件,不可變。
(int) const * p; //const 修飾*p,p是指標,*p是指標指向的物件,不可變。
( int) * const p;//const 修飾p,p不可變,p指向的物件可變
const ( int)* const p; // 前乙個const修飾*p,後乙個const修飾p,指標p和p指向的物件都不可變
const修飾也可以修飾函式的引數,當不希望這個引數值在函式體內被意外改變時使用,例如:
`void fun(const int *p);`
告訴編譯器*p在函式體中不能改變,從而防止了使用者的一些無意的或錯誤的修改。
const修飾符也可以修飾函式的返回值,返回值不可被改變。例如:
`const int fun(void);`
使用關鍵字 typedef 可以為型別起乙個新的別名,語法格式為:
typedef oldname newname;
oldname 是型別原來的名字,newname 是型別新的名字。
需要強調的是,typedef 是賦予現有型別乙個新的名字,而不是建立新的型別。為了「見名知意」,請盡量使用含義明確的識別符號,並且盡量大寫。
typedef struct stu
stu;
stu 是 struct stu 的別名,可以用 stu 定義結構體變數:
stu body1,body2;
它等價於:
struct stu body1, body2;
typedef int (*ptr_to_arr)[4];
表示 ptr_to_arr 是型別int * [4]的別名,它是乙個二維陣列指標型別。接著可以使用 ptr_to_arr 定義二維陣列指標:
ptr_to_arr p1, p2;
按照類似的寫法,還可以為函式指標型別定義別名:
typedef int (*ptr_to_func)(int, int);
ptr_to_func pfunc;
typedef 在表現上有時候類似於 #define,但它和巨集替換之間存在乙個關鍵性的區別。
正確思考這個問題的方法就是把 typedef 看成一種徹底的「封裝」型別,宣告之後不能再往裡面增加別的東西。
1) 可以使用其他型別說明符對巨集型別名進行擴充套件,但對 typedef 所定義的型別名卻不能這樣做。如下所示:
#define interge int
unsigned interge n; //沒問題
typedef int interge;
unsigned interge n; //錯誤,不能在 interge 前面新增 unsigned
2) 在連續定義幾個變數的時候,typedef 能夠保證定義的所有變數均為同一型別,而 #define 則無法保證。例如:
#define ptr_int int *
ptr_int p1, p2;
經過巨集替換以後,第二行變為:
int *p1, p2;
這使得 p1、p2 成為不同的型別:p1 是指向 int 型別的指標,p2 是 int 型別。
相反,在下面的**中:
typedef int * ptr_int
ptr_int p1, p2;
p1、p2 型別相同,它們都是指向 int 型別的指標。
關鍵字 嵌入式
const在指標中的用法 const int a 指向常整型的指標 int const a 指向常整型的指標 同上 int const a 指向整型的常指標 指標不可以改變,但是指標指向的物件的值可以改變 const int a 指向常整型數的指標 指標可以改變,但是指向的值是不可以改變的 cons...
嵌入式C語言面試常問關鍵字
修飾變數 變數分為區域性變數和全域性變數,都儲存在靜態區,而普通變數儲存在棧區。靜態全域性變數作用域僅僅侷限於變數被定義的檔案中,其他檔案不能使用 靜態區域性變數只能在函式中使用,同乙個檔案中其他函式沒法使用,它儲存在靜態區,即使函式結束,這個靜態區域性變數的值不會被銷毀,直到程式結束才會銷毀,函式...
嵌入式C語言常用關鍵字 學習筆記2
1 關鍵字概念及sizeof,return 編譯器預先定義了一定意義的字串 sizeof是關鍵字 2 資料型別 掌握大小範圍 1 char 硬體晶元操作的最小單位 bit 軟體操作的最小單位 8bit 1b 乙個位元組 char 描述的是硬體能夠操作的在軟體上體現的最小單位 應用場景 2 int l...