带有 void* return 和 void* 参数的函数指针

Function Pointer with void* return and void* parameters

我写了一个全为void*的函数指针,这样它就可以用于任何数值

  1. 整数
  2. 浮动
  3. 双.

但它只适用于int加法函数

对于floatdouble加法函数,会抛出编译时错误。 为什么会这样?

如果您取消注释最后两行 printf,您将收到错误消息

#include<stdio.h>

int int_add(int x, int y) {
    return x + y;
}

float float_add(float x, float y) {
    return x + y;
}

double double_add(double x, double y) {
    return x + y;
}
void* do_operation(void* (*op)(void*, void*), void* x, void* y) {
    return op(x, y);
}

void main(void) {

    printf("Sum= %d\n",(int*) do_operation(int_add, 1, 2));
    /*printf("Sum= %f\n",(float*) do_operation(float_add, 1.20, 2.50));*/
    /*printf("Sum= %lf\n",(double*) do_operation(double_add, 1.20, 2.50));*/
    
}

void *是指针类型。您不是在传递指针,而是在传递值,因此不会编译。它意外地对 int “有效”,因为大多数 C 编译器将指针本身表示为整数。

如果您将指针传递给 intfloatdouble 而不是 intfloatdouble 本身,您将避免该编译器错误。您还需要更改 int_add 和 friends 以获取指针,并且您必须确保在使用它们之前取消引用指针。您还必须 return 指针,这意味着您必须 malloc 堆上的一些内存,因为一旦函数退出,分配给局部变量的堆栈内存将无效。然后你将不得不 free 这一切都在以后......最后,这将导致比你试图解决的问题要复杂得多的问题。

我不得不问你为什么要这样做? C 确实不是这种模式的最佳语言。我建议直接调用 int_addfloat_add 等函数,而不是尝试以这种方式抽象它们。

所以根据@charles-srstka 的建议,我重写了代码,然后它按我想要的方式运行

#include<stdio.h>
#include<stdlib.h>


int* int_add(int *x, int *y) {
    int *c = (int *)malloc(sizeof(int));
    *c = *(int*)x + *(int*)y;
    return c;
}

float* float_add(float *x, float *y) {
    float *c = (float*)malloc(sizeof(float));
    *c = *(float*)x + *(float*)y;
    return c;
}

void* do_operation(void* (*op)(void*, void*), void* x, void* y) {
    return op(x, y);
}

void main(void) {

    int a = 1;
    int b = 2;                                               
    int *c;
    c = do_operation(int_add, &a, &b);
    printf("%d\n",*c);
    free(c);

    float x = 1.1;                                               
    float y = 2.2;                                               
    float *z;
    z = do_operation(float_add, &x, &y);
    printf("%f\n",*z);
    free(z);
}