_Generic 在 C 语言中被称为泛型选择(Generic Selection)或类型泛型表达式。这是 C11 标准引入的特性。

示例:

// 编译时根据类型选择
int i = 10;
char *result = _Generic(i,
    int: "integer",
    float: "float",
    default: "other"
);
// 编译后直接变成:char *result = "integer";

_Generic 是一个表达式,不是语句,错误示例:

// ❌ 错误!不能写多行代码
int i = 10;
char *result = _Generic(i,
    int: {
        printf("It's an integer\\\\n");  // 编译错误
        return "integer";
    },
    float: "float",
    default: "other"
);

多行逻辑解决办法

1. 使用函数调用

char* handle_int() {
    printf("Processing integer\\n");
    // 可以有复杂逻辑
    return "integer";
}

char* handle_float() {
    printf("Processing float\\n");
    return "float";
}

int i = 10;
char *result = _Generic(i,
    int: handle_int(),      // 调用函数
    float: handle_float(),
    default: "other"
);

2. 使用逗号运算符

int i = 10;
char *result = _Generic(i,
    int: (printf("It's an integer\\n"), "integer"),  // 逗号运算符
    float: (printf("It's a float\\n"), "float"),
    default: "other"
);

3. 结合条件表达式

int i = 10;
char *result = _Generic(i,
    int: i > 0 ? "positive integer" : "non-positive integer",
    float: "float",
    default: "other"
);

4. 如果需要复杂逻辑,建议用宏包装

#define HANDLE_TYPE(x) do { \\\\
    char *result = _Generic((x), \\\\
        int: handle_int(), \\\\
        float: handle_float(), \\\\
        default: "other" \\\\
    ); \\\\
    /* 在这里可以添加更多处理逻辑 */ \\\\
    printf("Result: %s\\n", result); \\\\
} while(0)

// 使用
int i = 10;
HANDLE_TYPE(i);

完整示例

示例1: