SV 巨集定義(macro)引發的災難

2021-09-13 09:54:25 字數 725 閱讀 5130

在開發中,用巨集定義可以帶來很多方便,但是使用不當,也會帶來災難,並且不容易debug出來,如下圖所示的程式碼:

`define    switch_64_128_bit         0

`define svt_axi_max_data_widtn 'd64 + `switch_64_128_bit * ('d64)

int lane_num = `svt_axi_max_data_widtn / 8;

會出什麼事呢?

結果是lane_num = 64。那麼為什麼會有這個現象呢?需要從define的原理說起:巨集定義相當於整體替換,因此上面的表示式相當於:

lane_num = 'd64 + `switch_64_128_bit * ('d64)  /  8

從四則混合運算的優先順序可知,此時會先計算乘法,再計算除法,最後計算加法。

建議:在巨集定義的所有引數都使用「()」,巨集定義的整體也使用「()」;

`define    switch_64_128_bit         0

`define svt_axi_max_data_widtn ('d64 + `switch_64_128_bit * ('d64))

int lane_num = `svt_axi_max_data_widtn / 8;

巨集 macro 定義的簡介

1.1巨集的簡單使用說明 define square x x x 下面我們就來用一下這個巨集 printf result d n square 5 無可厚非,結果就是5 5 25 int a 5 printf result1 d n square a 1 第一眼可能會脫口而出36,但是你文字替換一下...

巨集 macro 定義與使用

巨集的定義 巨集的替換與 展開 巨集的替換產生的問題 獲取巨集引數名稱 巨集引數的結合 巨集的取消 巨集定義的換行連線 標準預處理巨集 巨集 macro 是基於 define所實現的另一種預處理功能。與基本的 define定義的是常量相比,巨集 macro 允許多個引數化替換,引數中可以是固定的字串...

gdb 除錯巨集定義macro

c語言中的巨集定義,有著各種好處,當然也有它不好的一面。它實現的三個主要功能是 1 字串替換 2 標頭檔案包含 3 通用 模組的擴充套件 在 除錯時候,除錯巨集定義是比較麻煩的一件事,下面就介紹一種比較簡單的方法。include define max a,b a b a b define min a...