C語(yǔ)言宏定義##和#符的使用總結(jié)

????????最近在查找激光甲烷遙測(cè)儀有些主控板啟動(dòng)不了的原因時(shí),順便研究了TMS320VC5509A和STM32F407之間通過(guò)HPI接口的程序引導(dǎo)和利用CSL產(chǎn)生的HPI接口底層驅(qū)動(dòng)程序,其中HPI接口底層驅(qū)動(dòng)程序中使用了##連接符,現(xiàn)將C語(yǔ)言宏定義中的##和#符使用方法做一下總結(jié):

1、#

1)、定義

????????在C語(yǔ)言的宏定義中,#的功能是將其后面的宏參數(shù)進(jìn)行字符串化操作,即是在對(duì)它所引用的宏變量進(jìn)行替換后在其左右各加上一個(gè)雙引號(hào)。

2)、實(shí)例

????????比如下面代碼中的宏:

#define WARN_IF(EXP)? ? do{ if (EXP)? ? fprintf(stderr, "Warning: " #EXP "/n"); }? while(0)

那么在實(shí)際使用中的替換過(guò)程為:假如:WARN_IF (divider == 0);

被替換過(guò)程為

do {

if (divider == 0)

fprintf(stderr, "Warning" "divider == 0" "/n");

} while(0);

這樣每次divider(除數(shù))為0的時(shí)候便會(huì)在標(biāo)準(zhǔn)錯(cuò)誤流上輸出一個(gè)提示信息。

3)、注意事項(xiàng)

(1)對(duì)空格的處理

忽略傳入?yún)?shù)名前面和后面的空格。如:str=example1( abc ); 將會(huì)被擴(kuò)展成 str="abc";

(2)當(dāng)傳入?yún)?shù)名間存在空格時(shí),編譯器將會(huì)自動(dòng)連接各個(gè)子字符串,用每個(gè)子字符串中只以一個(gè)空格連接,忽略其中多余一個(gè)的空格。如:str=exapme( abc def); 將會(huì)被擴(kuò)展成 str="abc def";

(3)轉(zhuǎn)義字符

某些形式的傳入?yún)?shù)名中,若存在特殊字符,編譯器會(huì)自動(dòng)為其添加轉(zhuǎn)義字符號(hào)'\'。

如:string str=example1("escap'\e"); 相當(dāng)于:str="\"escap\'\\e\"";

2、##

1)、定義

????????在C語(yǔ)言的宏定義中,##被稱為連接符,用來(lái)將兩個(gè)Token連接為一個(gè)Token。

2)、實(shí)例

比如:#define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d

typedef struct _record_type LINK_MULTIPLE(name,company,position,salary);

// 這里這個(gè)語(yǔ)句將展開為:

// typedef struct _record_type name_company_position_salary;

3)、注意事項(xiàng)

(1)當(dāng)用##連接形參時(shí),##前后的空格可有可無(wú)。

如:#define exampleNum(n) num ## n 相當(dāng)于 #define exampleNum(n) num##n

(2)連接后的實(shí)際參數(shù)名,必須為實(shí)際存在的參數(shù)名或是編譯器已知的宏定義。

?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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