宏定義中的‘#’、‘##’操做符和‘...’、‘ __變參__ ’

宏定義中的‘#’、‘##’操做符和‘...’、‘ __變參__ ’ 


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

相關文章
相關標籤/搜索