#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/