我們平時使用帶參巨集時,字串中的巨集引數是沒有被替換的。例如:
輸出結果為:
然而,我們期望輸出的結果是:
5+20
=2513+
14=27
這該怎麼做呢?其實,c語言允許在字串中包含巨集引數。在類函式巨集(帶參巨集)中,#號
作為乙個預處理運算子
,可以把記號轉換成字串
。例如,如果a是乙個巨集形參,那麼#a就是轉換為字串"a"的形參名。這個過程稱為字串化(stringizing)
。以下程式演示這個過程:
輸出結果為:
這就達到我們想要的結果了。所以,#運算子
可以完成字串化(stringizing)
的過程。
與#運算子類似,##運算子
可用於類函式巨集(帶參巨集)的替換部分。##運算子
可以把兩個記號組合成乙個記號。例如,可以這樣做:
#define xname(n) x##n
然後,巨集xname(4)將展開x4。以下程式演示##運算子的用法:
輸出結果為:
注意:print_xn()
巨集用#運算子
組合字串,##運算子
把記號組合為乙個新的識別符號。
其實,##運算子
在這裡看來並沒有起到多大的便利,反而會讓我們感覺到不習慣。但是,使用##運算子
有時候是可以提高封裝性及程式的可讀性的。如跑實時作業系統的stm32程式中,關於gpio的硬體驅動中有如下**:
#define __stm32_pin(index, gpio, gpio_index) \
假設這樣使用該巨集:
__stm32_pin(7
, c,
13)
該巨集將展開為:
然後這就可以很方便的將要使用的硬體引腳這麼一一列出來,然後再拿去進行配置:
以上就是關於#運算子與##運算子的筆記,用#運算子組合字串,##運算子把記號組合為乙個新的識別符號。如有錯誤歡迎指出。資料:『rt-thread-iot**』、『c primer plus』。
NOT運算子與 運算子
6.4.2 not運算子與 運算子 對於簡單的條件查詢,not運算子與 運算子的功能幾乎沒有什麼區別,那麼not運算子的優勢體現在 呢?答案是它可以與其他運算子組合使用,這一點是 運算子所不能實現的。在6.4.1節已經介紹了not運算子與in運算子組合使用的例子,下面給出乙個not運算子與betwe...
C語言 運算子和 運算子
變數 代表 取變數的位址 變數 代表 指標型的變數 取址運算子 用來取得其運算元的位址。如果運算元 x 的型別為 t,則表示式 x 的型別是 t 型別指標 指向 t 的指標 取址運算子的運算元必須是在記憶體中可定址到的位址。換句話說,該運算子只能用於函式或物件 例如左值 而不可以用於位欄位,以及那些...
C語言算術運算子與位運算子
1.算術操作符 前兩個不用多說,即是乘號,是求餘 取模 運算,注意 兩側運算元需均為整數 若除數與被除數符號不同,則結果符號與被除數保持一致。如 14 3 2 14 3 2 是求商運算,注意 若 的除數與被除數均為整數將執行舍位 即捨去小數中任何部分 如14 3 4 若除數與被除數符號不同,則結果符...