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
相关产品推荐
相关产品推荐

