为何我的_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
相关产品推荐
相关产品推荐

