现代化 C 使用体验

2022-05-01 16:35:35 +08:00
 lcj2class

自己一些粗浅的使用体验,欢迎大家批评指正。

8225 次点击
所在节点    C
48 条回复
cnbatch
2022-05-03 04:53:43 +08:00
@xiri 其实 container_of 不使用 typeof 也可以实现,FreeBSD 的源码就有:
https://github.com/freebsd/freebsd-src/blob/main/sys/dev/cxgb/cxgb_adapter.h

代码是:
#define container_of(p, stype, field) ((stype *)(((uint8_t *)(p)) - offsetof(stype, field)))



有意思的是,Linux 源码当中也有不用 typeof 来 define 的,而且似乎是唯一一处:
https://github.com/torvalds/linux/blob/master/tools/lib/bpf/bpf_helpers.h

#define container_of(ptr, type, member) \
({ \
void *__mptr = (void *)(ptr); \
((type *)(__mptr - offsetof(type, member))); \
})
#endif

稍微追溯了下提交历史,这是两年前新增的:
https://github.com/torvalds/linux/blob/5fbc220862fc7a53a0455ccd2d96c82141e222d4/tools/lib/bpf/bpf_helpers.h

仔细一看,原来是 BPF ,也是跟 BSD 有关的东西,或许这种写法属于“BSD-style”吧。但是跟 BSD 版本相比,bpf_helpers.h 的写法仍然更加接近于 Linux 的 typeof 版本。
Bbird
2022-05-03 08:57:51 +08:00
@cnbatch #41 linux 内核源码的 container_of 没有使用 typeof 吧,全部都是三个参数的

/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({ \
void *__mptr = (void *)(ptr); \
((type *)(__mptr - offsetof(type, member))); })
Bbird
2022-05-03 09:01:15 +08:00
@cnbatch #41 较早的内核代码用了 typeof , 新的去掉了
cnbatch
2022-05-03 13:54:10 +08:00
@Bbird 重新下载了新的内核代码树看了下,确实是这样。很久以前看的时候他还是 typeof ,搞得我以为现在还是。原来现在甚至还有专门的 container_of.h ,方便了不少
cnbatch
2022-05-03 14:01:53 +08:00
@Bbird 现在的 container_of 去掉了 typeof ,但我想不到风格还是跟原来的差不多,依旧是先来一个变量赋值,下一行再做减法,并且仍然需要大括号。
虽然终于不再依赖 typeof ,但相比之下,我仍然更喜欢 BSD 的那种。同样的效果,却更加简洁、易懂。
按道理,GPL 代码照抄 BSD 是完全可以的。
iClass
2022-05-03 17:56:31 +08:00
和 C 一起出生的人 我叫 IC
rahuahua
2022-05-03 18:14:21 +08:00
@Buges zig 也不少年头了,影响力太小了
lijiangang886
2022-05-06 08:05:21 +08:00
取代 C 这种伟大的事业,一听就是没可能做到的样子

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/850384

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX