_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"
);
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"
);
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"
);
int i = 10;
char *result = _Generic(i,
int: i > 0 ? "positive integer" : "non-positive integer",
float: "float",
default: "other"
);
#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);