C多种类型的function

我想在C中编写一些函数,但它们必须适用于所有数字类型(int,float,double)。 什么是好习惯? 在void上使用指针(当然还有指向函数的指针)? 或者为每种类型写一个不同的function?

例如:

float func(float a, float b) { return a+b; } 

如果你可以使用C11, _Generic可以帮助:

 #include  int ifunc(int a, int b) { return a+b; } float ffunc(float a, float b) { return a+b; } double dfunc(double a, double b) { return a+b; } #define func(x, y) \ _Generic((x), int: ifunc, float: ffunc, double: dfunc, default: ifunc)(x, y) int main(void) { { int a = 1, b = 2, c; c = func(a, b); printf("%d\n", c); } { float a = .1f, b = .2f, c; c = func(a, b); printf("%f\n", c); } { double a = .1, b = .2, c; c = func(a, b); printf("%f\n", c); } return 0; } 

由于C没有像C ++那样的多重调度(函数重载)(编辑:除非你使用C11,它有_Generic),你必须以不同的方式命名每种类型的函数,如funcInt(int a, int b); funcFloat(float a, float b); funcInt(int a, int b); funcFloat(float a, float b);

要么

使用GCC样式的语句表达式宏,它允许typeof()来伪造它 。

在C ++中,可以通过模板或函数重载轻松完成。 我在C中知道的唯一方法是为每种类型编写不同的函数。

您可以使用带有两个void*的函数并使用它们进行计算,但这对用户来说极具误导性:如果有一个特殊类型,该函数的另一个版本可用,但用户使用void*函数,该怎么办? 这可能会导致很大的问题,不建议这样做。

有关此实例,请查看位于stdlib.h中的标准字符串转换函数atoi , atol , atof 。 每个变量类型一个函数。

旧式C方式是使用联合和鉴别器:

 union multi_num { uint32_t small_num; uint64_t large_num; float float_num; }; struct multi_type { int discriminator; union multi_num val; }; int add_fun (struct multi_type var1, struct multi_type var2, struct multi_type *ret_val) { if (var1.discriminator != var2.discriminator) { return -1; } ret_val->discriminator = var1.discriminator; switch (var1.discriminator) { case 1: ret_val->val.small_num = var1.val.small_num + var2.val.small_num; break; case 2: ret_val->val.large_num = var1.val.large_num + var2.val.large_num; break; case 3: ret_val->val.float_num = var1.val.float_num + var2.val.float_num; break; } return 0; } 

然后你可以像这样调用它:

 struct multi_type var1, var2, var3 = {0}; var1.discriminator = 1; var2.discriminator = 1; var1.val.small_num = 1; var2.val.small_num = 12; ret = add_fun(var1, var2, &var3); if (0 == ret) { printf("add worked, ret is %d\n", var3.val.small_num); } else { printf("add failed\n"); }