C11 的 _Generic,现实当中用得多不多?(尤其是公司项目) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cnbatch
V2EX    C

C11 的 _Generic,现实当中用得多不多?(尤其是公司项目)

  •  
  •   cnbatch 113 天前 1788 次点击
    这是一个创建于 113 天前的主题,其中的信息可能已经有所发展或是发生改变。
    逛 reddit 的时候见到这个帖子,自称用 C 语言( C23 标准)练手:

    https://www.reddit.com/r/C_Programming/s/liueGRtmXs

    讨论当中有人提到 _Generic 或许挺有用,原 OP 认为 nullptr 比 NULL 更好。

    C11 标准已经推出十几年了,这个 _Gneric 用得多不多?毕竟 C23 引入 nullptr ,就是因为 _Generic 的缘故( N3042 提案)

    然后原帖还有人觉得 _Generic 这个名字太糟糕了。我觉得也是,搞出好几个下划线开头的大小写混合关键字,用起来很不方便。

    顺便一提,原 OP 的练手项目用的是 xmake 。
    我记得 xmake 作者也在 V 站,给你一个大赞,你的项目又帮了一个人。
    3 条回复    2025-08-13 01:31:52 +08:00
    PTLin
        1
    PTLin  
       113 天前
    就在 Linux 内核里看到过,这么用的比较多
    #define page_folio(p) (_Generic((p), \
    const struct page *: (const struct folio *)_compound_head(p), \
    struct page *: (struct folio *)_compound_head(p)))
    cnbatch
        2
    cnbatch  
    OP
       112 天前
    Github 找了下,“练手”项目会用得比较多,大型项目也有在用,只是不算广泛

    Linux 内核除了 1 楼提到的,还有类似这种:
    https://github.com/torvalds/linux/blob/0e39a731820ad26533eb988cef27ad2506063b5b/include/linux/seqlock.h#L252

    #define __seqprop(s, prop) _Generic(*(s), \
    seqcount_t: __seqprop_##prop, \
    __seqprop_case((s), raw_spinlock, prop), \
    __seqprop_case((s), spinlock, prop), \
    __seqprop_case((s), rwlock, prop), \
    __seqprop_case((s), mutex, prop))

    用 _Generic 辅助做拼接


    NetBSD 的 indent 用到了:
    https://github.com/NetBSD/src/blob/80dbdd9020fb73df509a4d01b0eac6b73d43b29e/usr.bin/indent/args.c#L56

    #define get_offset(name, type) \
    _Generic((&opt.name), type *: offsetof(struct options, name))

    应该是用作类型安全的 offsetof


    FreeBSD 自身暂时仍未用到 _Generic ,但引用的第三方工具用到了

    https://github.com/freebsd/freebsd-src/blob/d888317796190bec350aea3701b8aed3bfdad4c8/contrib/tzcode/private.h#L870

    # define TIME_T_MIN \
    _Generic((time_t) 0, \
    signed char: SCHAR_MIN, short: SHRT_MIN, \
    int: INT_MIN, long: LONG_MIN, long long: LLONG_MIN, \
    default: TIME_T_MIN_NO_PADDING)

    对应的来源应该是这个
    https://github.com/eggert/tz/blob/main/private.h
    cnbatch
        3
    cnbatch  
    OP
       112 天前
    个人观点:

    Linux 源码对于 _Generic 的大部份用法基本上就是常规“重载”式用法,而最值得关注的是使用 _Generic 做拼接,这个实用性不错

    NetBSD 的 _Generic 配合 offsetof 非常好,起到了强制类型安全的作用,值得推广

    比较遗憾的是,升级到 C11 的老项目并不多
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3991 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 05:28 PVG 13:28 LAX 21:28 JFK 00:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86