关于宏的两个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源文件才找出问题。

大意害死人。

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