泛型选择
泛型选择(Generic Selection) 是 C23 标准引入的一个新特性,它根据表达式的类型来选择不同的值。通过 _Generic
关键字实现。
基本语法
_Generic
的基本语法如下:
c
_Generic(表达式,
类型1: 值1,
类型2: 值2,
default: 默认值
)
当编译器评估 _Generic
表达式时,它会:
- 确定括号中表达式的类型
- 在类型列表中查找匹配项
- 如果找到匹配的类型,返回对应的值
- 如果没有找到匹配项,返回 default 对应的值
实际示例
c
#include <stdio.h>
#define TYPE_NAME(x) _Generic((x), \
int: "整数", \
double: "双精度浮点数", \
char: "字符", \
default: "未知类型" \
)
int main() {
int i = 42;
double d = 3.14;
char c = 'A';
printf("i 的类型是: %s\n", TYPE_NAME(i)); // 输出: i 的类型是: 整数
printf("d 的类型是: %s\n", TYPE_NAME(d)); // 输出: d 的类型是: 双精度浮点数
printf("c 的类型是: %s\n", TYPE_NAME(c)); // 输出: c 的类型是: 字符
return 0;
}
实用场景
创建类型安全的泛型函数。例如:
c
#define MAX(x, y) _Generic((x), \
int: max_int, \
double: max_double, \
float: max_float \
)(x, y)
int max_int(int a, int b) {
return (a > b) ? a : b;
}
double max_double(double a, double b) {
return (a > b) ? a : b;
}
float max_float(float a, float b) {
return (a > b) ? a : b;
}
注意事项
- 泛型选择在编译时进行,不会产生运行时开销
- 每个类型只能出现一次
- 表达式不会被求值,只会用来判断类型
- 类型匹配必须精确,不会进行隐式类型转换