1、#運(yùn)算符
我們平時(shí)使用帶參宏時(shí),字符串中的宏參數(shù)是沒有被替換的。例如:
輸出結(jié)果為:
然而,我們期望輸出的結(jié)果是:
5 + 20 = 25
13 + 14 = 27
這該怎么做呢?其實(shí),C語言允許在字符串中包含宏參數(shù)。在類函數(shù)宏(帶參宏)中,#號(hào)作為一個(gè)預(yù)處理運(yùn)算符,可以把記號(hào)轉(zhuǎn)換成字符串。例如,如果A是一個(gè)宏形參,那么#A就是轉(zhuǎn)換為字符串"A"的形參名。這個(gè)過程稱為字符串化(stringizing)。以下程序演示這個(gè)過程:
輸出結(jié)果為:
這就達(dá)到我們想要的結(jié)果了。所以,#運(yùn)算符可以完成字符串化(stringizing)的過程。
2、##運(yùn)算符
與#運(yùn)算符類似,##運(yùn)算符可用于類函數(shù)宏(帶參宏)的替換部分。##運(yùn)算符可以把兩個(gè)記號(hào)組合成一個(gè)記號(hào)。例如,可以這樣做:
#define XNAME(n) x##n
然后,宏XNAME(4)將展開x4。以下程序演示##運(yùn)算符的用法:
輸出結(jié)果為:
注意:PRINT_XN()宏用#運(yùn)算符組合字符串,##運(yùn)算符把記號(hào)組合為一個(gè)新的標(biāo)識(shí)符。
其實(shí),##運(yùn)算符在這里看來并沒有起到多大的便利,反而會(huì)讓我們感覺到不習(xí)慣。但是,使用##運(yùn)算符有時(shí)候是可以提高封裝性及程序的可讀性的。如stm32的一些例程中,關(guān)于gpio的硬件驅(qū)動(dòng)中有如下代碼:
#define __STM32_PIN(index, gpio, gpio_index) \
{ \
index, GPIO##gpio##_CLK_ENABLE, GPIO##gpio, GPIO_PIN_##gpio_index \
}
假設(shè)這樣使用該宏:
__STM32_PIN(7, C, 13)
該宏將展開為:
{7, GPIOC_CLK_ENABLE, GPIOC, GPIO_PIN_13}
然后這就可以很方便的將要使用的硬件引腳這么一一列出來,然后再拿去進(jìn)行配置:
以上就是關(guān)于#運(yùn)算符與##運(yùn)算符的筆記,用#運(yùn)算符組合字符串,##運(yùn)算符把記號(hào)組合為一個(gè)新的標(biāo)識(shí)符。如有錯(cuò)誤歡迎指出。資料:『RT-Thread-IoT代碼』、『C Primer Plus』。
關(guān)注我的公號(hào)【嵌入式大雜燴】,回復(fù):C語言,可獲取C語言資料。
關(guān)注我的個(gè)人博客:【我的博客】查看更多筆記






