C與C++中的宏

來源:互聯網
上載者:User
       很多程式員不知道C中的“宏”到底是什麼意思?特別是當宏有參數的時候,經常把宏和函數混淆。我想在這裡我還是先講講“宏”,宏只是一種定義,他定義了一個語句塊,當程式編譯時間,編譯器首先要執行一個“替換”來源程式的動作,把宏引用的地方替換成宏定義的語句塊,就像文字檔替換一樣。這個動作術語叫“宏的展開”。使用宏是比較“危險”的,因為你不知道宏展開後會是什麼一個樣子。例如下面這個宏:

#define MAX(a, b) a>b?a:b
當我們這樣使用宏時,沒有什麼問題: MAX( num1, num2 ); 因為宏展開後變成 num1>num2?num1:num2;。 但是,如果是這樣調用的,MAX( 17+32, 25+21); 呢,編譯時間出現錯誤,原因是,宏展開後變成:17+32>25+21?17+32:25+21,Woh,這是什麼啊?
所以,宏在使用時,參數一定要加上括弧,上述的那個例子改成如下所示就能解決問題了。

#define MAX( (a), (b) ) (a)>(b)?(a)b)
即使是這樣,也不這個宏也還是有Bug,因為如果我這樣調用 MAX(i++,j++); , 經過這個宏以後,i和j都被累加了兩次,這絕不是我們想要的。所以,在宏的使用上還是要謹慎考慮,因為宏展開是的結果是很難讓人預料的。而且雖然,宏的執行很快(因為沒有函數調用的開銷),但宏會讓原始碼澎漲,使目標檔案尺寸變大,(如:一個50行的宏,程式中有1000個地方用到,宏展開後會很不得了),相反不能讓程式執行得更快(因為執行檔案變大,運行時系統換頁頻繁)。
因此,在決定是用函數,還是用宏時得要小心。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.