關於宏的兩個bug

個人用define定義宏的時候,有個習慣,進行宏拓展時候,習慣於把外面傳進來的參數加上小括號使用。

例如: #definesum(x, y)((x) + (y))

如果要定義宏對結構體進行操作,以前也是使用其指針形式進行操作,所以亦無礙。

如:#defineget_num(N) ((N)->num)

但是今天無意,使用了結構體本身,固有的六年多的習慣栽了跟頭。

有結構體NUM:

typedef struct _NUM {

int num;

}NUM;

#defineget_value(N) ((N).num)

這個結構體本身無意義,示例而已。但是結構體下面的宏就有問題了。下午gcc編譯時候,一直給出warning,個人竟然看了半天,才找出結構體對象N被小括號包圍後成了(N)問題,(N)當然無法知道其成員變量num所在了。真是習慣害死人。

又定義了宏set_value,代碼如下:

#defineset_value(N, num) ((N)->num = num)

宏set_value裏面的第二個參數num和結構體NUM的成員變量num同名,gcc同樣給出warning,又是看了半天,通過gcc -E源文件才找出問題。

大意害死人。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章