关于形参和临时指针变量的有关问题
关于形参和临时指针变量的问题
下面这个宏,大家都知道是它是通过成员地址获得成员所在结构的首地址。
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
这里ptr形参实际上是指向member的,新创建的__mptr也是指向member的。
我的问题是:为何不直接使用传过来的member的指针变量ptr进行后面的操作而非要新创建一个临时指针变量__mptr来进行其他操作?
使用新创建的临时指针变量__mptr有何意义?
------解决方案--------------------
我想这么做是担心会修改ptr本身的值。
------解决方案--------------------
防止不小心修改ptr指向的值
由于形参是没有修饰符,所以如果不小心修改ptr所指向的值,编译器可能不会报错
所以引入__mptr并加上const修饰符,在后面如果不小心修改了指向的值,就会报错了
一种对源数据进行保护的机制
下面这个宏,大家都知道是它是通过成员地址获得成员所在结构的首地址。
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
这里ptr形参实际上是指向member的,新创建的__mptr也是指向member的。
我的问题是:为何不直接使用传过来的member的指针变量ptr进行后面的操作而非要新创建一个临时指针变量__mptr来进行其他操作?
使用新创建的临时指针变量__mptr有何意义?
------解决方案--------------------
我想这么做是担心会修改ptr本身的值。
------解决方案--------------------
防止不小心修改ptr指向的值
由于形参是没有修饰符,所以如果不小心修改ptr所指向的值,编译器可能不会报错
所以引入__mptr并加上const修饰符,在后面如果不小心修改了指向的值,就会报错了
一种对源数据进行保护的机制