泛型选择
泛型选择 (Generic Selection) 是 C11 标准引入的一个新特性,它根据表达式的类型来选择不同的值。通过 _Generic 关键字实现。
基本语法
_Generic 的基本语法如下:
c
_Generic(表达式,
类型1: 值1,
类型2: 值2,
default: 默认值
)1
2
3
4
5
2
3
4
5
当编译器对 _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';
char* s = "Hello World!";
printf("i 的类型是:%s\n", TYPE_NAME(i));
printf("d 的类型是:%s\n", TYPE_NAME(d));
printf("c 的类型是:%s\n", TYPE_NAME(c));
printf("s 的类型是:%s\n", TYPE_NAME(s));
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
可能的输出(示例):
bash
<输出与输入或平台相关,请以实际运行为准>
zsh - generic_type
i 的类型是:整数
d 的类型是:双精度浮点数
c 的类型是:字符
s 的类型是:未知类型
实用场景
_Generic 最常见的用途是实现类型泛型的宏。下面用一个简单的类型名称打印宏演示核心思路:
c
#include <stdio.h>
#define PRINT_TYPE(x) printf("类型:%s\n", _Generic((x), \
int: "整数", \
double: "双精度浮点数", \
float: "单精度浮点数", \
default: "未知类型" \
))
int main(void) {
int i = 42;
double d = 3.14;
float f = 2.71f;
PRINT_TYPE(i);
PRINT_TYPE(d);
PRINT_TYPE(f);
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
更复杂的场景(如根据类型分派到不同函数)需要函数定义语法,第7章将展开讲解。