C語言巨集基礎總結

2022-08-21 00:15:09 字數 1244 閱讀 4801

最近在做一些專案的時候,不小心把ndk下面的一些巨集寫得有問題,導致一些編譯不過的問題。所以,總結一下。

這些知識都可以在 gcc 文件上找到,本文主要參考博文《c語言巨集的特殊用法和幾個坑》

(1) 標示符別名

#define pi 3.14159
在預處理階段:pi = pi結果是pi=3.14159;

(2)巨集函式

巨集名之後帶括號的巨集被認為是巨集函式。用法和普通函式一樣,只不過在預處理階段,巨集函式會被展開。優點是沒有普通函式儲存暫存器和引數傳遞的開銷,展開後的**有利於cpu cache的利用和指令**,速度快。缺點是可執行**體積大。

#define min(x, y)  ((x) < (y) ? (x) : (y))
y = min(1, 2);會被擴充套件成y = ((1) < (2) ? (1) : (2));

(1)字串化(stringification)

在巨集體中,如果巨集引數前加個#,那麼在巨集體擴充套件的時候,巨集引數會被擴充套件成字串的形式.如:

#define warn_if(exp) \

do \

while (0)

呼叫是使用warn_if (x == 0);會被擴充套件成:

do 

while (0);

這種用法可以用在assert中,如果斷言失敗,可以將失敗的語句輸出到反饋資訊中。

(2) 連線(concatenation)

在巨集體中,如果巨集體所在標示符中有##,那麼在巨集體擴充套件的時候,巨集引數會被直接替換到標示符中。如:

#define command(name)  

struct command

;

在巨集擴充套件的時候

struct command commands =

;

會被擴充套件成:

struct command commands =

, ,

...};

#define foo (4 + foo)
交叉引用,巨集體也只會展開一次,foo只會展開成(4 + foo),而展開之後foo的含義就要根據上下文來確定了。

載入巨集基礎

一 簡介 載入巨集可以擴充套件excel的功能,與excel的內建功能一致,是為excel提供自定義命令或自定義功能的補充程式。某些載入巨集還提供了可用於公式中的新的工作表函式。使用某載入巨集必須已安裝,且須在載入巨集對話方塊中進行呼叫。載入巨集預設安裝在microsoft office offic...

c 語言基礎總結

1.strlen和sizeof區別?因為sizeof值在編譯時確定,所以不能用來得到動態分配 執行時分配 儲存空間的大小。sizeof type sizeof expr 2.陣列和指標 使用陣列的時候編譯器會把他轉換為指標。因此在一些情況下陣列的操作實際是指標的操作。使用陣列作為auto變數的初始值...

C語言基礎總結

常用的資料型別 基於32位作業系統 void 宣告函式無返回值或無引數 空型別 1 char 字元型型別資料 1 int 整型資料 4 float 單精度浮點型資料 4 double 雙精度浮點型資料 8 short 短整型資料 2 long 長整型資料 4 long long 長長整型資料 8 l...