C 宏的容器_中的赋值运算符是如何工作的

C 宏的容器_中的赋值运算符是如何工作的,c,linux,linux-device-driver,C,Linux,Linux Device Driver,我曾尝试在linux内核中使用宏的容器_ 我从谷歌得到的信息如下 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #define container_of(ptr, type, member) \ ({ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(typ

我曾尝试在linux内核中使用宏的容器_

我从谷歌得到的信息如下

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

#define container_of(ptr, type, member) \
({ const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
 (type *)( (char *)__mptr - offsetof(type,member) );})

#define CONT(prt, type, mem) container_of((prt), type, mem)

struct test {
 int a;
};

struct m {
 int b;
 struct test t;
 int c;
};

int main(int argc, char *argv[])
{
 /* existing structure */
 struct m *ma;
 ma = malloc(sizeof(struct m));
 ma->t.a = 5;
 ma->b = 3;
 /* pointer to existing entry */    
 struct test *te = &ma->t;

 struct m *m = CONT(te, struct m, t);

 printf("m->b = %d\n", m->b);

 return EXIT_SUCCESS;
}
o/p m->b=3

但是我对*m的任务有疑问。我试过跟随

#include <stdio.h>

int main()
{
        int x = (int k = 9;k-2;);
        printf("x= %d k = %d",x,k);
}
如果这个赋值在这里是错误的,那么它在宏的容器中是如何工作的。上面两个的区别是什么。我知道一个是宏,另一个是正常的声明,但是在宏扩展之后,两者看起来是一样的

注:请原谅,这可能是一个简单的问题,但我无法理解


kinldy为我的dobut提供了一些解决方案。

这使用了特殊的gcc特性,即块表达式{}。这些允许在表达式中具有对象定义。此构造中的最后一条语句确定块表达式的值

因此,您错过了测试用例表达式中的附加{}

此外:

该宏中没有赋值,只有局部变量的初始化 其中的typeof操作符还有一个gcc扩展
这是使用特殊的gcc特性,即块表达式{}。这些允许在表达式中具有对象定义。此构造中的最后一条语句确定块表达式的值

因此,您错过了测试用例表达式中的附加{}

此外:

该宏中没有赋值,只有局部变量的初始化 其中的typeof操作符还有一个gcc扩展
我对这个问题加上我的答案是因为我有点道理。这可能会对其他人有所帮助

#include <stdio.h>
int main()
{
int x = ({int k = 9;k-2;});
printf("x = %d",x);

 }
o/p x=7

正如Jens在上面所说的那样,我遗漏了{},但除此之外,我正在打印k的值,这是不正确的,因为在{}中创建的所有值都是临时的,并且将在计算表达式的值时立即删除


我对这个问题加上我的答案是因为我有点道理。这可能会对其他人有所帮助

#include <stdio.h>
int main()
{
int x = ({int k = 9;k-2;});
printf("x = %d",x);

 }
o/p x=7

正如Jens在上面所说的那样,我遗漏了{},但除此之外,我正在打印k的值,这是不正确的,因为在{}中创建的所有值都是临时的,并且将在计算表达式的值时立即删除


你认为你想用这个int x=int k=9做什么;k-2;;?我想把值7分配给x,是不是应该这样:int k=9;int x=k-2?你认为你想用这个int x=int k=9做什么;k-2;;?我想把值7分配给x,是不是应该这样:int k=9;int x=k-2?正是我想要的谢谢你的回答正是我想要的谢谢你的回答。