个人用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源文件才找出问题。
大意害死人。