SOGO論壇
  登入   註冊   找回密碼
查看: 439|回覆: 0
列印 上一主題 下一主題

[技術文章] #define 巨集的宣告與使用 [複製連結]

Rank: 11Rank: 11Rank: 11Rank: 11

熱心參予論壇活動及用心回覆主題勳章 數位硬體勳章

狀態︰ 離線
跳轉到指定樓層
1
發表於 2012-7-20 09:58:52 |只看該作者 |倒序瀏覽
巨集指令 #define 宣告的格式如下


#define macroname string
其說明如下:
macroname 為一連串的字元(不含空白字元) 或是類似函數的標題,如 macroname(arg1, arg2) 含有左括號及右括號。
編譯器於前置處理時會將程式中出現 macroname 以 string 來替代。
巨集指令基本上是以一行為單位。因此替代字串是從 macroname 後第一個非空白字元起至該行結束。
如果巨集指令超過一行,則以反斜線 \ 表示下一行繼續下去。
巨集指令的使用(或呼叫),如同函數的呼叫,將 macroname 置於程式中,為一辨識個體(identifier)即可。對於含引數型的巨集指令(將於 8.1.2 節談到引數型的巨集指令),其呼叫方式與函數的呼叫型式完全一樣。

巨集指令的使用範圍為有宣告處起至檔案的結束,一般而言,巨集指令都是宣告於檔案的開端,或是宣告於檔頭,即檔案其副檔名為 .h 再以 #include 的方式加入。

例 1: 設有一 C 程式檔 file.c 其內容為:

        #define MAXSIZE 100
        main( )
        {   int A[MAXSIZE];   }

於編譯時經過前置處理後,該程式變成
        main( )      
        {   int A[100];   }

其中所有的 #define 指令都不見了,MAXSIZE 也都變成了 100。當然前 置處理後的結果我們也見不到。
第 8.1.1 節 常數辨識個體的宣告

為了程式易讀易維修,程式中的常數通常都是以巨集方式來宣告一常數名稱,該名稱通常是以大寫的字串來表示。本節將重複介紹 第 2.2.5 節 所提到的 符號常數。

例 2: 設有一 C 程式其內容如下:

      #define MAXSIZE 100
           :
           :
      main( )
      {   int A[MAXSIZE]; .....;}
      void f( )
      { ......
          for (i=0;i < MAXSIZE; i++)
          .........
       }

說明:

由辨識體 MAXSIZE 本身即可明白該文的意義。
如果陣列的大小要改為 200,只要改巨集指令為 #define MAXSIZE 200 即可,整個程式仍保持其一致性。
一些常用的常數如 EOF, NULL 都是宣告於 stdio.h 檔中,要使用這些常數,於檔案中必須加上 #include 指令。前置處理指令 #include 將於 8.2 節中討論

第 8.1.2 節 含引數型的巨集指令

含引數型的巨集指令,其宣告格式為


#define macroname(arg1[,arg]) string1 arg1
其說明如下:

macroname 為該巨集指令的名稱
arg1 為其引數
string1 arg1 為其替代字串
其呼叫方式如同函數呼叫方式一樣。
例 3:對於巨集指令的宣告

     #define set_nonnegative(A);  if (A<0)\
                                     A=A*(-1);

則於程式中
        set_nonnegative(i);

經過前置處理後即變成
        if(i<0)
         i=i*(-1);

其中形式引數 A 皆由實際引數 i 來替代。
例 4:對於巨集指令的宣告

     #define  swap_int(A,B);  {int t;\
                                  t=A;A=B;B=t;}

於程式中巨集呼叫
      swap_int(i,j);

經過前置處理後即變成
      {int t; t=i; i=j; j=t;}

含引數的巨集指令,稍一不慎就會產生錯誤,如例 4 中 swap_int(s,t); 則會產生問題,為什麼?

巨集指令的宣告亦有階層式,即可利用前面宣告過的巨集指令,如例 5。

例 5:階層式巨集指令

           #define max(A,B)  ((A>B)?A:B)
           #define max3(A,B,C)  max( max(A,B),c)

問題:試比較 macro 與 function 的優劣點。
C++ 的 inline 作用如同 macro 的作用。


喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2024-4-28 13:58

© 2004-2024 SOGO論壇 OURSOGO.COM
回頂部