C语言是否支持泛型编程?毫无疑问,答案是不支持。
什么是泛型编程,我觉得用C++里面的模板可以很好的说明。
#include比如函数add就是一个模板函数,它既能支持整数的相加,也能支持浮点数的相加,甚至是其他的自定义类型,只要能提供相加的规则,编译器都能通过。//函数模板 template void add(T x, T y) { std::cout << x + y << std::endl; } int main() { add(1, 2); add(1.11f, 2.22f); return 0; }
#include第一个表达式就是变量a,后面依次跟上可能的类型,如果是int类型,就输出int,如果是char类型,就输出char。int main() { int a; printf("%s ", _Generic((a), int : "int", char : "char")); return 0; }
#include再次运行程序,这样得到的结果就会更丰富一些。#define TYPE_NAME(val) _Generic((val), int : "int", char : "char", short : "short", float : "float", double : "double", int * : "int *", default : "unkown") int main() { int a; char b; int *c; double d; printf("%s ", TYPE_NAME(a)); printf("%s ", TYPE_NAME(b)); printf("%s ", TYPE_NAME(c)); printf("%s ", TYPE_NAME(d)); return 0; }
int add_int(int a,int b) { printf("%d + %d = %d ",a,b,a+b); return a+b; } float add_float(float a,float b) { printf("%f + %f = %f ",a,b,a+b); return a+b; } void unsupport() { printf("unsupport type "); }然后来一个宏定义,根据第一个参数的类型来匹配到底调用哪个函数。
#define ADD(x,y) _Generic((x), int:add_int(x,y), float:add_float(x,y), default:unsupport())主函数里面调用ADD函数,参数既可以是int,也可以是float。
int main() { ADD(1, 2); ADD(1.11f, 2.22f); return 0; }运行程序,确实也能达到C++函数模板的效果。
root@Turbo:test# ./1 1 + 2 = 3 1.110000 + 2.220000 = 3.330000 root@Turbo:test#
全部0条评论
快来发表一下你的评论吧 !