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

#define LEN 5

#define sum_mac(func,type)\
    void* func (void* arr, int size)\
    {\
    int i;\
    type *sum = (type*)malloc(sizeof(type));\
    if(sum == NULL)\
    {\
        printf("Error\n");\
        exit(1);\
    }\
    *sum = 0;\
    for(i = 0; i<size ; i++)\
    {\
        *sum = *sum + *((type*)arr[i]);\
    }\
    return sum;\
    }\
sum_mac(int_sum,int);
void *summary(void* arr, int size, void *(*func)(void*, int))
{
    if (func == NULL)
        return NULL;
    return (*func)(arr, size);
}

int main()
{
    int arr[] = { 1,2,3,4,5 };
    int *sum = summary(arr, LEN, int_sum(arr, LEN));
    printf("the sum is: %d ", *sum);
    free(sum);
    return 0;
}

当我试图编译此代码时,出现以下错误:
错误LNK2019函数中引用的未解析外部符号整数和
当我为这个问题寻找可能的原因时,我得到了“链接器无法解析的函数或变量的引用,或者找不到它的定义”。
有人能帮我找到问题吗。

最佳答案

至少有三个问题:
您将宏实例包含在宏本身中,更改:

}\
sum_mac(int_sum,int);

致:
}
sum_mac(int_sum,int);

因此sum_mac不是宏的一部分。
在宏定义中,更改:
*sum = *sum + *((type*)arr[i]);

致:
*sum = *sum + ((type*)arr)[i];

在第一种情况下,尝试在空指针类型上使用索引,这是不可能的(空格没有大小)。因此,将arr转换为正确类型的指针并对其使用算术运算。
--------------编辑-----------
更改:
int *sum = summary(arr, LEN, int_sum(arr, LEN));


int *sum = summary(arr, LEN, int_sum);

在第一种情况下,调用summary时,第三个参数值是调用int_sum的结果,如果不是函数指针,而是指向某些int的指针,则是结果。您需要传递函数指针。
大多数问题都是由于宏的使用造成的。这就绕过了类型系统,愚弄了编译器,这不是个好主意。

关于c - 总结void *值的数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49317682/

10-11 18:42