【C語言學(xué)習(xí)】#運(yùn)算符與##運(yùn)算符

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è)人博客:【我的博客】查看更多筆記

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容