C语言中PrintMat函数触发C2371重定义错误的解决方法
解决C2371错误:PrintMat重复定义问题
错误原因
C2371错误是因为编译器识别到PrintMat的声明与定义类型冲突:你在multMat1中先调用了PrintMat,但该函数的定义在multMat1之后,C语言会自动隐式声明PrintMat为int PrintMat(),可实际你的PrintMat是void返回类型,两者类型不匹配,触发了"重复定义"的错误提示。
修复方案
有两种直接有效的解决方式:
方案1:提前声明PrintMat函数
在multMat1函数之前,添加PrintMat的函数声明,告诉编译器该函数的正确类型:
// 声明PrintMat函数 void PrintMat(int n, float* M); void multMat1(int n, float* A, float* B, float* C) { int i, j, k; float sum = 0.0; PrintMat(n, A); PrintMat(n, B); /* This is ijk loop order. */ for (i = 0; i < n; i++) for (j = 0; j < n; j++) { for (k = 0; k < n; k++) C[i + j * n] += A[i + k * n] * B[k + j * n]; } PrintMat(n, C); } void PrintMat(int n, float* M) { int i, j; for (j = 0; j < n; j++) { for (i = 0; i < n; i++) printf("%.3f ", M[i + j * n]); printf("\n"); } printf("\n"); }
方案2:调整函数顺序
把PrintMat的定义放到multMat1之前,这样编译器在处理multMat1时已经知道PrintMat的正确类型,无需额外声明:
void PrintMat(int n, float* M) { int i, j; for (j = 0; j < n; j++) { for (i = 0; i < n; i++) printf("%.3f ", M[i + j * n]); printf("\n"); } printf("\n"); } void multMat1(int n, float* A, float* B, float* C) { int i, j, k; float sum = 0.0; PrintMat(n, A); PrintMat(n, B); /* This is ijk loop order. */ for (i = 0; i < n; i++) for (j = 0; j < n; j++) { for (k = 0; k < n; k++) C[i + j * n] += A[i + k * n] * B[k + j * n]; } PrintMat(n, C); }
额外提示
- 你代码中
printf的字符串存在乱码(如"; "),建议替换为标准换行符"\n",避免输出格式异常。 - 若代码涉及多文件结构,需确保
PrintMat仅在一个文件中定义,其他文件通过头文件包含声明来调用,避免全局范围内的重复定义。
内容的提问来源于stack exchange,提问作者Giovanni Mosquera
相关产品推荐
相关产品推荐

