嵌入式C語言入門 關鍵字 巨集

2021-09-02 07:17:50 字數 4485 閱讀 5129

關鍵字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...