1、‘#’
在宏函數的替換部分,#符號用做一個預處理運算符,它能夠把參數的實際值轉換成字符串。
例如:
若是‘甲’是一個宏參數,那麼‘#甲’就是一個字符串,表示實際參數值的名字串,即把實際參數名轉化成相應的字符串。該過程稱爲參數字符串化.
代碼以下: 編程
#包含 「習語言系統.接口」
#定義 平方(x) 格式輸出(#x "的平方是 %整。%行",(x)*(x))
整數類型 主函數(整數類型 參數個數, 字符類型* 參數[] )
{
整數類型 年齡 = 12;
平方(年齡);
平方(1+2+4);
返回 0;
}
輸出以下:
年齡的平方是 144。
1+2+4的平方是 49。 函數
這裏:第一次調用宏時使用「年齡」代替#x;第二次調用時用「1+2+4"代替#x。 工具
2、‘##’
‘##’運算符能夠用在宏函數的替換部分,把兩個語言符號組合成單個語言符號,如一個參數經組合成爲另外一個變量或函數名 。
例如:
#定義 廣東車牌( 號碼 ) 粵A##號碼
這樣宏調用:
廣東車牌( 123456 )
展開後就是:
粵A123456
程序: spa
#包含 「習語言系統.接口」 blog
#定義 廣東車牌( 號碼 ) 「粵A##號碼」
#定義 輸出變量( 編號 ) 格式輸出(「變量%整= %整%行」,編號,變量##編號 ) 接口
整數類型 主函數(整數類型 參數個數, 字符類型* 參數[] )
{
整數類型 變量1= 11, 變量2= 22;
格式輸出( 「車牌=%串%行」, 廣東車牌( 888888) );
輸出變量(1);
輸出變量(2);
返回 0;
} 字符串
輸出: get
車牌=粵A##號碼
變量1= 11
變量2= 22 編譯
由輸出可見,車牌因爲有雙引號,沒有展開, 可見##符號在雙引號內不起做用。 class
後面的輸出變量宏的 參數 1,2 經鏈接後被轉換爲變量的名字:變量1, 變量2。
假如我想用宏輸出像上面的例子裏的:粵A123456 這樣的串改怎麼作呢? 看下面例子:
#包含 「習語言系統.接口」
#定義 廣東車牌( 號碼 ) 粵A##號碼
#定義 串化名字( X ) #X
#定義 串化車牌( 車牌 ) 串化名字( 車牌 )
#定義 輸出變量( 編號 ) 格式輸出(「變量%整= %整%行」,編號,變量##編號 )
整數類型 主函數(整數類型 參數個數, 字符類型* 參數[] )
{
整數類型 變量1= 11, 變量2= 22;
格式輸出( 「車牌=%串%行」, 串化車牌(廣東車牌(888888)) );
格式輸出( 「車牌=%串%行」, 串化名字(廣東車牌(888888)) );
輸出變量(1);
輸出變量(2);
返回 0;
}
此次輸出以下:
車牌=粵A888888
車牌=廣東車牌(888888)
變量1= 11
變量2= 22
可見本次輸出使用
串化車牌 宏時, 其參數 廣東車牌(888888) 先進行了展開,獲得:粵A888888, 而後串化,做爲字符串輸出。
在使用
串化名字 宏時, 其參數 廣東車牌(888888) 沒有進行展開,直接進行串化,做爲字符串輸出。
此例演示了宏參數展開時的展開法則:
一、當宏替換部分存在 ‘#’ 或 ‘##’ 時, 宏參數不進行展開, 直接按宏參數字面進行字符串化或鏈接操做。
二、當宏替換部分不存在 ‘#’ 或 ‘##’ 時,宏參數假如是宏,先進行宏展開。
3、變參宏 ‘...’和‘ __變參__ ’
變參宏定義中參數列表的最後一個參數爲省略號(也就是三個點)。預約義宏‘__變參__’被用在替換部分中,以表示替換髮生時省略號表明的內容。
例如:
#包含 「習語言系統.接口」
#定義 宏輸出(...) 格式輸出(「輸出=>」 __變參__ )
整數類型 主函數(整數類型 參數個數, 字符類型* 參數[] )
{
宏輸出( 「你好%行」);
宏輸出( 「小明年齡=%整」,10 );
返回 0;
}
運行輸出以下:
輸出=>你好
輸出=>小明年齡=10
省略號只能代替最後面的宏參數。
#定義 變參宏(甲,乙,...) 正確
#定義 變參宏(甲,...,乙) 錯誤
注:以上示例使用習語言編譯工具編譯。
欲瞭解更多中文C語言編程知識,請訪問 http://www.xiyuyan.org