C 宏的容器_中的赋值运算符是如何工作的
我曾尝试在linux内核中使用宏的容器_ 我从谷歌得到的信息如下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
#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?正是我想要的谢谢你的回答正是我想要的谢谢你的回答。