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

C语言如何为二维数组创建泛型选择器,按类型调用对应打印函数

C语言二维数组泛型选择器实现方案

你给出的参考代码思路是正确的,问题出在_Generic的类型匹配规则不符合C语言数组的类型退化逻辑:

  • 二维数组作为参数传递时,数组名会退化为指向首行一维数组的指针:比如n * n的int二维数组,退化后类型为int (*)[n],float类型则为float (*)[n]。你原来写的int*[sizeof(a)]是「存储int指针的数组」类型,和实际传参类型不匹配,因此宏无法正常触发匹配。

修正后的完整代码

#include <stdio.h>

// float二维数组打印函数
void printff(int n,float m[n][n])
{
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++)
            printf("\t%f",m[i][j]);
        printf("\n");
    }
}

// int二维数组打印函数
void printfi(int n,int m[n][n])
{
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++)
            printf("\t%d",m[i][j]);
        printf("\n");
    }
}

// 修正后的泛型选择宏
#define print(n, arr) _Generic((arr), \
    int (*)[n]: printfi, \
    float (*)[n]: printff \
)(n, arr)

// 测试用例
int main()
{
    int n = 3;
    int arr_int[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
    float arr_float[3][3] = {{1.1,2.2,3.3}, {4.4,5.5,6.6}, {7.7,8.8,9.9}};

    print(n, arr_int);
    printf("\n");
    print(n, arr_float);
    return 0;
}

注意事项

  • 实现依赖C11及以上标准,编译时需添加-std=c11参数
  • 以上代码仅支持行列数相等的正方形二维数组,如需支持行列不等的场景,只需调整函数参数,把行、列长度分别传入,同步修改_Generic的类型匹配规则即可
  • 如需扩展支持更多元素类型,直接在_Generic分支中新增对应类型和处理函数即可

内容的提问来源于stack exchange,提问作者Bhaumik_Tandan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:00:01