Skip to content

泛型选择

泛型选择(Generic Selection) 是 C23 标准引入的一个新特性,它根据表达式的类型来选择不同的值。通过 _Generic 关键字实现。

基本语法

_Generic 的基本语法如下:

c
_Generic(表达式,
    类型1: 值1,
    类型2: 值2,
    default: 默认值
)

当编译器评估 _Generic 表达式时,它会:

  1. 确定括号中表达式的类型
  2. 在类型列表中查找匹配项
  3. 如果找到匹配的类型,返回对应的值
  4. 如果没有找到匹配项,返回 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;
}

注意事项

  1. 泛型选择在编译时进行,不会产生运行时开销
  2. 每个类型只能出现一次
  3. 表达式不会被求值,只会用来判断类型
  4. 类型匹配必须精确,不会进行隐式类型转换