我一直以为C会一直没有泛型,结果在C11标准中加入了宏_Generic
,我们可以使用简单的泛型了!先来一个演示
#define get_type(expr) _Generic((expr), int: "int",char: "char", double: "double")
#include <stdio.h>
int main(void){
printf("Type of 234: %s\n", get_type(234));
printf("Type of 'A': %s\n", get_type('A'));
printf("Type of (char)'A': %s\n", get_type((char)'A'));
printf("Type of 3.14: %s\n", get_type(3.14));
}
Type of 234: int
Type of 'A': int
Type of (char)'A': char
Type of 3.14: double
_Generic的用法是_Generic ( assignment-expression , generic-assoc-list )
.
- assignment-expression,用于判断表达式类型
- generic-assoc-list用于根据表达式类型来执行不同的操作,一个稍微复杂的操作
#define generic_add(x,y) _Generic( x,int: _Generic(y,\
int: x+y,\
double:(double)x+y,\
default:0),\
double: _Generic(y,\
int: x+(double)y,\
double:x+y,\
default:0),\
default:0)
#include <stdio.h>
int main(void){
printf("int add: %d", generic_add(1,2));
printf("int add: %f", generic_add(1.2,2));
}
int add: 3int add: 3.200000
这个例子我们演示了如果泛型函数有两个参数该如何写,没错就只能嵌套着写了,我们必须一个参数一个参数的判断类型,之后再写执行逻辑.C语言的泛型编程现在还相当初级,不过既然有了,我想完善也是迟早的事儿.