C语言代码编译报LNK2019未解析外部符号错误,求排查
解决LNK2019未解析外部符号错误及代码中的其他问题
你遇到的LNK2019错误,核心原因是代码里存在函数指针传递错误,同时还有数组访问的语法问题,导致链接器无法正确识别int_sum函数的引用。咱们一步步拆解修复:
1. 修复main函数中的函数指针传递错误
在main里调用summary时,你错误地直接调用了int_sum(arr, LEN),把函数的返回值(void*类型)传给了需要函数指针的第三个参数。summary的第三个参数要求是void *(*func)(void*, int)类型的指针,正确的做法是直接传递函数名int_sum(函数名本身就是指向该函数的指针):
原错误代码:
int *sum = summary(arr, LEN, int_sum(arr, LEN));
修复后:
int *sum = summary(arr, LEN, int_sum);
2. 修复宏中的数组访问语法错误
在sum_mac宏里,void* arr不能直接用arr[i]访问元素——因为void类型没有固定大小,编译器无法计算arr[i]的内存偏移量。正确的做法是先把arr强制转换为type*类型,再通过下标访问元素:
原错误代码:
*sum = *sum + *((type*)arr[i]);
修复后(两种写法都可以):
// 写法1:更直观 *sum = *sum + ((type*)arr)[i]; // 写法2:用+=简化 *sum += ((type*)arr)[i];
3. 可选:清理宏调用后的冗余分号
你的宏调用sum_mac(int_sum,int);末尾的分号,会在宏展开后变成函数定义后面多一个分号。虽然C语言允许这种写法,但可能触发编译器警告,建议去掉分号:
sum_mac(int_sum,int)
修复后的完整代码
#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 += ((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); printf("the sum is: %d ", *sum); free(sum); return 0; }
现在编译运行这段代码,就能正常输出the sum is: 15,LNK2019错误也会消失。
内容的提问来源于stack exchange,提问作者safaa tareef
相关产品推荐
相关产品推荐

