container

更新时间:2023-03-01 01:44:14 阅读: 评论:0

c语言中container_of, typeof, offtof这些是哪个标准的?

1. container_of是Linux内核中实现的宏,不是C语言的标准函数。不能跨平台。

#define container_of(ptr, type, member) ({ \

const typeof( ((type *)0)->member ) *__mptr = (ptr); \

(type *)( (char *)__mptr - offtof(type,member) );})

2. typeof是GNU C的扩展,不是ISO标准中的函数。用gcc编译可以跨平台。

3. offtof是C语言标准库中的宏,定义在头文件stddef.h中。可以跨平台。


C语言程序container_of问题

container_of是内核的一个宏。

你现在的错误是未定义这个宏导致的


可以自己手动添加这个宏

#include<stdio.h>
#include<stddef.h>
#include<stdlib.h>

typedefstruct
{
intnum;
chara;
}node;
#definecontainer_of(ptr,type,member)({\
consttypeof(((type*)0)->member)*__mptr=(ptr);\
(type*)((char*)__mptr-offtof(type,member));})

#definecontainer_of2(ptr,type,member)({\
(type*)((char*)ptr-offtof(type,member));})

voidmain()
{
node*p=(node*)malloc(sizeof(node));
p->num=1;
p->a='a';
printf("offtof:%lu\n",offtof(node,num));
printf("addr:%lu\n",p);
printf("containerof:%lu\n",container_of(&(p->a),node,a));
}

如何在用户空间使用container

但由于是在驱动中实现的这个宏,有没有办法在用户空间测试呢?
有的。我们可以将linux/kernel.h头文件包含进来,直接在用户空间测试这个宏的巧妙之处。
下面就是我的测试代码。
main.c文件

#include
#include
#include
#include

struct cona_t{
int i;
int j;
int v;
char t[10];
unsigned short xy;
};

struct cona_t ct;
unsigned short xy;
int main(int argc,char * argv[])
{
int xy;
struct cona_t * p;
memt(&ct,0,sizeof(struct cona_t));
ct.i = ct.j = ct.v = 10;
sprintf(ct.t,"%s","sdf");
ct.xy = 20;
p = container_of(&ct.xy,struct cona_t,xy);

printf("%s\n",p->t);
return 0;
}

下面是Makefile文件
CC=gcc
TAR=main
SRC=main.c
KERNEL_INCLUDE ?= /lib/modules/$(shell uname -r)/build/include
all:
$(CC) -D__KERNEL__ -o $(TAR) -I$(KERNEL_INCLUDE) $(SRC)

clean:
rm -f $(TAR)

如果打开kernel.h文件,就会发现这个container_of这个宏定义如下:
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offtof(type,member) );})

offtof又被如下定义:
#ifdef __KERNEL__
#undef offtof
#ifdef __compiler_offtof
#define offtof(TYPE,MEMBER) __compiler_offtof(TYPE,MEMBER)
#el
#define offtof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif

那个__compiler_offtof原型是__builtin_offtof这个是GCC编译器所特有的。

编写程序,建立一个带有节点的单向链表,输入字符串,并按从小到大顺序组织到链表中

int main()

{

Link head; //链表(不带头节点)

int n;

printf("输入链表的长度n: ");

scanf("%d",&n);

printf("连续输入%d个数据(以空格隔开): ",n);

head=CreateLink(n);

printf("\n原本链表的节点是: ");

DispLink(head);

LinkSort(head);

printf("\n从大到小排序之后: ");

DispLink(head);

printf("\n");

return 0;

}

链表的具体存储表示为:

① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)

② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))

链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。

以上内容参考:百度百科-单链表


一箱货 用英语怎么说

要看你是什么箱子了
木箱是wooden ca
硬纸版箱是carton(这个很常用)
铁皮箱子是iro heetca
集装箱是container或shipping container
通常前两者用的比较多,特别是carton.泛指的话ca也行,最好不同箱子用相对应的单词.

C语言宏定义里,用小括号中加花括号括起来的代码块,这种形式的宏定义理解不了

宏定义就是无条件替换啊,当出现container_of(ptr, type, member)这种形式的语句时候,就无条件替换为
({\
const typeof( ((type *)0)->member ) *__mptr = (ptr);\
(type *)( (char *)__mptr - offtof(type,member) );})
就跟普通的两条程序一样,没有什么特别难于理解的啊,
宏定义的存在本来就是为了简化书写的。
你看到的是container_of(ptr, type, member),
但是编译器遇到这个就会直接无条件转化了成下边那长的两句了。

本文发布于:2023-02-28 19:16:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/zhishi/a/167760625457660.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:container.doc

本文 PDF 下载地址:container.pdf

标签:container
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 实用文体写作网旗下知识大全大全栏目是一个全百科类宝库! 优秀范文|法律文书|专利查询|