You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:05:30