⭐语法
Ref: 泛型选择 (C11 起) - cppreference.com
关键词:
_Generic(控制表达式 , 关联列表) (C11 起)
关联列表
控制表达式
- 任何表达式(除了逗号运算符),若不使用
default
关联,则其类型必须与 类型名 之一兼容。
判定解释
控制表达式 的类型经历左值转换。
只在类型域中进行转换
- 舍弃顶层 cvr 限定符和原子属性
- 数组到指针/函数到指针变换
- 不实例化任何副效应或计算任何值
有类型匹配,若其类型与各关联之一的 类型名 兼容,则解释为冒号后的表达式。
无类型匹配,且提供了 default
关联,则解释为其后的表达式。
注意
关联列表 中的任意二个 类型名 不能指定兼容类型。
使用关键词 default
的关联只能有一个。若不使用 default
,且无一 类型名 与控制表达式类型兼容,则程序无法编译。
⭐举例
🚩判断对象类型
_Generic
可以判断自定义类型。
cvr
限定符对类型识别不受影响。
default
不是必须写道最后一个,顺序这方面没有限制。
#include <stdbool.h>
#include <stdio.h>
struct Node {
};
#define get_typename(x) \
_Generic((x), \
default: "other", \
_Bool: "bool", \
int: "int", \
char: "char", \
struct Node: "struct Node"