個人用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源文件才找出問題。
大意害死人。