现代化 C 使用体验

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

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

8225 次点击
所在节点    C
48 条回复
d16uga1l
2022-05-01 16:42:17 +08:00
真棒
cmdOptionKana
2022-05-01 16:51:28 +08:00
干货满满呀
icyalala
2022-05-01 16:59:41 +08:00
用 GNU extension 特性要慎重,这会让你代码可移植性变差。。
echo1937
2022-05-01 17:21:51 +08:00
@icyalala 同意,我在 Mac 上直接 clang ,extension 就❌了
dongcidaci
2022-05-01 18:21:39 +08:00
Linux 内核也开始支持 c11 了,想想有点小激动
dongcidaci
2022-05-01 18:30:42 +08:00
错误处理那一节感觉没太看懂,前后处理方式有什么区别呢,就是把错误码封装到了结构体里面吗
xiri
2022-05-01 18:41:46 +08:00
@dongcidaci 前一个做法是 return 错误码,函数处理结果通过入参的指针带出,这样链式调用的话后一个函数只能拿到前一个函数返回的错误码,而没法用它的处理结果作为自己的输入;后一种做法将错误码和处理结果封装在一起 return ,可以避免这种问题
xiri
2022-05-01 18:46:15 +08:00
@icyalala 但是 container_of (其中用到的 typeof 关键字是 GNU C 扩展的)是真的香,将我从各种重复的链表操作中解放了出来😂
Frytea
2022-05-01 19:14:52 +08:00
@dongcidaci 准确说应该是 Linux 5.18 开始采用 C11 标准,我理解是使用新标准来编译和实现,对标准的支持应该是编译器的工作呀
12101111
2022-05-01 19:28:34 +08:00
cleanup 扩展 clang 没有,intel 的 iwd 用了这玩意,我移植了几次之后懒得管了,直接删了用回 wpa_supplicant

(只安装了 clang 的 Gentoo 系统)
codefever
2022-05-01 20:31:56 +08:00
下次如果能直接复制到帖子里就更好了
secondwtq
2022-05-01 20:49:19 +08:00
虽然拿一堆 extension 来说“Modern C”有些呃呃,不过 Clang 好像老早就支持了 cleanup 啊 ...
secondwtq
2022-05-01 20:50:43 +08:00
另外 Clang 一直在试图和 GCC 保持兼容,社区里面好像有不止一股力量想要用这玩意编译 Kernel ( which 强依赖各种 GCC 扩展
wheeler
2022-05-01 21:26:50 +08:00
Buges
2022-05-01 22:06:13 +08:00
C 演进的实在太慢了,zig 才能叫 modern C ,它们之间的 interoperability 近似于 Java 和 kotlin ,是真正有希望取代 C 的。
lcj2class
2022-05-01 22:42:23 +08:00
@12101111 #10 是不是版本比较低,clang 是支持 cleanup 的,我 macOS 上的的 clang 一直用的很好
12101111
2022-05-01 22:55:54 +08:00
@secondwtq
@lcj2class

抱歉,记错了,iwd 是 cleanup 和 gcc 的另一个扩展一起用了 https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

这个 gcc 扩展 clang 不支持,不过据说也有可能进 c23
lcj2class
2022-05-01 23:00:23 +08:00
@Buges #15 慢不是坏事,慢工出细活。C++ 倒是演进得快, 但发展到现在已经太臃肿了。
LotusChuan
2022-05-02 00:42:55 +08:00
指针那块有个很简单的区分数组指针和指针数组的方式,就是看优先级:[ ]的优先级比*高,所以 int *arr[100]是指针数组; int (*ptr)[100]是数组指针。感觉你写得有点复杂了。
ecnelises
2022-05-02 00:50:46 +08:00
GCC 的主要扩展 Clang 都支持,其余的 Clang 处在一个随缘状态:不保证一定支持,但你要实现也没什么人反对。

滥用编译器扩展的确会影响可移植性,但两害相权取其轻,GCC 扩展的可移植性比起内联汇编和各种指令集 /操作系统强相关的自带函数还是好多了。Mac 迁移到 ARM 算是在这方面敲醒了一些人。只要把这些特定编译器的扩展封到宏 /函数里,然后对不支持的编译器加上#error ,问题不大。

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

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

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

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

© 2021 V2EX