C语言中_Generic无法区分int与char的问题及解决问询
让_Generic适配char类型的解决方法
问题原因
C语言中,字符常量(如'c')的类型是int,而非char。所以你的代码里test('c')会触发_Generic的int分支,返回1,而非期望的char分支返回0。
解决方案
方案1:修改宏,强制转换参数类型
在_Generic的判断表达式中,将参数强制转为char类型,这样无论传入字符常量还是char变量,都会匹配char分支:
#include <stdio.h> #define test(x) _Generic( (char)(x), \ char: 0, \ int: 1, \ double: 3, \ default: 4 \ ) int main() { printf("%d\n", test('c')); // 返回0 char c = 'c'; printf("%d\n", test(c)); // 返回0 printf("%d\n", test(123)); // 返回1,int类型正常匹配 return 0; }
方案2:传入char类型变量
如果不想修改宏逻辑,调用宏时传入char类型的变量而非直接传字符常量:
#include <stdio.h> #define test(x) _Generic((x), \ char: 0, \ int: 1, \ double: 3, \ default: 4 \ ) int main() { char c = 'c'; printf("%d\n", test(c)); // 返回0 return 0; }
补充说明
C标准规定字符常量的类型为int,这是历史兼容和扩展字符集处理的需要。要让_Generic匹配char分支,必须保证判断的表达式类型为char,上述两种方法都能实现这一点。
内容的提问来源于stack exchange,提问作者user20598969
相关产品推荐
相关产品推荐

