《C語言參考手冊(原書第5版)》第3章C預處理器,C預處理器是一種簡單的宏處理器。從概念上說,它在編譯器讀取源程序之前對C程序的源文本進行處理。在C的有些實現中,預處理器實際上是一個獨立的程序。它讀取最初的源文件,並寫入到一個新的“經過預處理”的源文件,後者可以作爲C編譯器的輸入。本節爲大家介紹宏參數的副作用。
3.3.7 宏參數的副作用
宏也可能因爲副作用而產生問題。由於宏的實際參數可能會被文本複製,它們的執行次數可能不止一次,因此實際參數的副作用可能會產生不止一次。反之,與宏調用看上去很相似的真正函數調用對實參表達式的求值次數正好只有一次,因此表達式的副作用也正好出現一次。爲了避免這種問題,在使用宏時必須小心。
例子
考慮前一個例子的SQUARE宏以及(幾乎)完成相同任務的square函數:
(12和5可能是b和a的最終值,這是因爲標準C編譯器可能以不同的方式對表達式((a++)*(a++)進行求值。參見第7.12節。)
參考:增值操作符++ 第7.4.4節。