You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的_Generic语句报“Expression expected”错误?

问题分析与解决

你的错误根源在于**_Generic的第一个参数必须是表达式,而不是单纯的类型名**。

C11标准明确规定_Generic的语法要求第一个参数是可求值的表达式,而你当前的TYPE_TO_DARRAY_TYPE宏中直接传入了(type)(比如uint8_t)——这是类型标识符,不是合法表达式,编译器因此报“Expected expression”错误。

修复方案

只需把类型名包装成合法表达式即可,两种常用实现方式:

方式1:使用复合字面量

将(type)替换为((type){0}),这是C99引入的复合字面量,会生成对应类型的零值表达式,_Generic可正常识别其类型:

#define TYPE_TO_DARRAY_TYPE(type) \
    _Generic(((type){0}),          \
        uint8_t: unsigned8,       \
        uint16_t: unsigned16,     \
        uint32_t: unsigned32,     \
        int8_t: signed8,          \
        int16_t: signed16,        \
        int32_t: signed32,        \
        char*: string,            \
        default: unknown)

方式2:使用类型转换的零值

对于基本类型和指针类型,(type)0是合法表达式,同样能被_Generic识别:

#define TYPE_TO_DARRAY_TYPE(type) \
    _Generic((type)0,             \
        uint8_t: unsigned8,       \
        uint16_t: unsigned16,     \
        uint32_t: unsigned32,     \
        int8_t: signed8,          \
        int16_t: signed16,        \
        int32_t: signed32,        \
        char*: string,            \
        default: unknown)

验证修复效果

修改后调用CreateDynamicArray(uint8_t, 10)会正常展开:

InternalCreateDynamicArray(_Generic(((uint8_t){0}), uint8_t: unsigned8, ...), 10)

此时_Generic的第一个参数是合法表达式,编译器可正确识别类型并匹配对应枚举值,不再报错。

内容的提问来源于stack exchange,提问作者Zenais

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 01:30:56