宏定義的參數爲什麼會有副作用

《C語言參考手冊(原書第5版)》第3章C預處理器,C預處理器是一種簡單的宏處理器。從概念上說,它在編譯器讀取源程序之前對C程序的源文本進行處理。在C的有些實現中,預處理器實際上是一個獨立的程序。它讀取最初的源文件,並寫入到一個新的“經過預處理”的源文件,後者可以作爲C編譯器的輸入。本節爲大家介紹宏參數的副作用。

AD: 51CTO雲計算架構師峯會 搶票進行中!

3.3.7   宏參數的副作用

宏也可能因爲副作用而產生問題。由於宏的實際參數可能會被文本複製,它們的執行次數可能不止一次,因此實際參數的副作用可能會產生不止一次。反之,與宏調用看上去很相似的真正函數調用對實參表達式的求值次數正好只有一次,因此表達式的副作用也正好出現一次。爲了避免這種問題,在使用宏時必須小心。

例子

考慮前一個例子的SQUARE宏以及(幾乎)完成相同任務的square函數:

 
這個宏可以求浮點數的平方根,而這個函數只能求整數的平方根。另外,調用函數的運行速度要稍慢於調用宏。但是,和可能產生的副作用相比,這些差別是微不足道的。在下面的程序片段中:
 
變量b獲得的值是9,而變量a的最終值是4。但是,在下面這個表面看上去相似的程序片段中:
 
變量b值可能是12,變量a的最終值可能是5,這是因爲後面這個程序片段被展開爲:
 

(12和5可能是b和a的最終值,這是因爲標準C編譯器可能以不同的方式對表達式((a++)*(a++)進行求值。參見第7.12節。)

參考:增值操作符++ 第7.4.4節。

發佈了21 篇原創文章 · 獲贊 9 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章