泛型编程指那些没有特定,但是一旦指定一种类型,就可以转换成指定类型的代码。C11新增了一种表达式,叫作泛型选择表达式,可根据表达式的类型(即表达式的类型是int、double还是其他类型)选择一个值。泛型选择表达式不是预处理器指令,但是在有一些泛型编程中它常用作#define宏定义的一部分。
_Generic(x,int: 0,float: 1,double: 2,default: 3)
_Generic 是C11的关键字。_Generic后面的圆括号中包含多个用逗号分隔的项。第1个项是一个表达式,后面的每个项都由一个类型、一个冒号和一个值组成,如 float: 1.第1个项的类型匹配哪个标签,整个表达式的值是该标签后面的值。? ?例如,假设上面的表达式中x是int类型的变量,x的类型匹配int:标签,那么整个表达式的值就是0.? 如果没有与类型匹配的标签,表达式的值就是default:标签后面的值.
下面是一个把泛型选择语句和宏定义组合的例子:
#define MY(X) _Generic((X),\
int: "int",\
float: "float",\
)
宏必须定义为一条逻辑行,但是可以用、把一条逻辑行分隔成多条物理行。像这种情况,对泛型表达式求值得字符串。? 例如,对MY(5)求值得“int”,因为值5的类型与int:标签匹配。