????????最近在查找激光甲烷遙測(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ù)名或是編譯器已知的宏定義。