1.函數體直接使用宏定義不管有沒有返回值都不能作賦值運行的左右值 . 如下圖示:
錯誤提示:
2.通過使用小括號()把函數體括起來使用宏定義可以得到該函數體最後一條語句運算結果,這裡還需要注意 ,不能漏了' ; ',
如下圖示:
打印結果如下:
3.一般情況下使用多語句宏定義時 ,最好使用do{...}while(0)或者({})的形式
因為在if() 結構裡做分支執行部分時,使用do{...}while(0)可以使調用時後面能正確的使用' ; ' ,一旦沒寫就會像普通語句那樣報錯 , 這樣符合我們的習慣 , 如果只是使用{}的結構體形式 , 那麼在調用時後面不能使用' ; ' , 如果按照我們的習慣寫上 ' ; ' ,那麼就有可能引起錯誤 . 比如 : if()後面還有else語句的話, 就會出錯 , 因為 ' ; '被當作另外一條語句(空指令)的結束符插在else的上面 .
注意 : 使用do{...}while(0)結構之後就不能把這個把這個宏定義作為賦值操作的左右值了.
圖示如下:
打印結果對應如下:
4.需要得到函數式宏定義的返回值的方法
從上面我們已經可以知道當我們使用({})形式的宏定義時 , 只要函數體最後一次運算出的結果是我們想要的那使用這個形式是可以正確取得返回值的 並且放在賦值操作的右端; 當我們使用do{...}while(0)形式的宏定義時 , 我們是無法通過賦值操作來得到返回值的 , 但是我們可以通過多加一個參數 , do{}while(0)裡面把要放回的值賦給多加的這個參數 , 這樣我們就可以得到想要的返回值了.
演示圖示如下:
打印結果如下: