關於巨集定義的計算問題

2021-07-25 13:16:24 字數 1078 閱讀 4780

巨集定義分廠好用,我也經常用
但是呢,巨集定義也有一些缺點

比如呢,這裡給出乙個簡單的巨集定義

假如在程式中用呢,就是

uint32_t data = a;

巨集定義就是簡單的替換

所以呢就變成了

uint32_t data = ((((1*2)+3)*4)+5);

其實最終呢咱們想要的是

data = 25;

但是假如編譯器不幹任何事情的話

那麼本來乙個簡單的賦值操作就被搞成了 兩個乘法 兩個加法 最後由乙個賦值

所以你應該先乾一件事

了解你的編譯器,看一下編譯器會不會直接給你計算出來,

經過測試呢,我經常用的keil編譯器,確實把這些東西都給做好了

但是,假如你不是的話呢,那你就要自己看一下,你的編譯器了

下面說一下我的測試方法

寫乙個函式

呼叫這個函式

然後,看一下這個函式編譯成彙編是什麼

比如呢void test(void)

{ float angle = 0.0f;

uint32_t test = 0;

#define pi                              ((float)3.1415926535898f)

/* 弧度到角度(計算方法:180 / π) */

#define radiantoangle ((float)(180.0f) / pi)

/* 角度到弧度(計算方法: π / 180) */

#define angletoradian ((float)(pi / 180.0f))

angle = 3.1415926;

#define data0 (((1*2)+3)+4)

test = data0;

這條c語言**對應的彙編**為

test = data0;

movs r0,#0x19;

所以證明了keil編譯器會幫我把數自動計算好

關於巨集定義

一 巨集替換 1.巨集展開的順序 先由外層向內層檢查,直至最內層後依次向外層展開。例外 遇到 開頭的巨集就不再往內檢查,從該層開始往外展開。2.重新掃瞄和替換 在替換列表中的所有引數替換過之後,預處理器將對結果token序列重新掃瞄以便對其中的巨集再次替換。當正在替換的巨集在其替換列表中發現自身時,...

關於巨集定義

發現release版本是沒有上面的這些巨集定義,所以準備去unity的playersettings去設定看看,我加了乙個ttt的巨集定義,發現結果還是這樣,如圖下 發現了debug模式下是有這些亂七八糟的巨集定義的,但是release模型下是沒有的,怎麼辦呢?我準備修改這個檔案試試把debug有的巨...

巨集定義問題

include define sub x,y x y define access before element,offset,value sub element,offset value int main access before array 5 4 6 for i 0 i 10 i return...