c - 我想在 C 中为二维数组创建一个通用选择器

标签 c generics late-binding

如果 2d 数组是 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");
        }
    }
    
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(a,b) _Generic(b,int*[sizeof(a)]:printfi,float*[sizeof(a)]:printff)(a,b)

最佳答案

宏应该是:

#define print(a,b) _Generic((b), int(*)[]: printfi, float(*)[]: printff)((a), (b))

b 的类型是 int(*)[a]float(*)[a],例如指向 a intfloat 数组的指针。

这段代码对我有用:

#include <stdio.h>

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");
    }
}
    
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(a,b) _Generic((b), int(*)[]: printfi, float(*)[]: printff)((a), (b))

int main()
{
    float a[5][5];
    for(int i=0;i<5;i++)
        for(int j=0;j<5;j++)
            a[i][j] = i * 5 + j;
    print(5, a);
    int b[2][2];
    for(int i=0;i<2;i++)
        for(int j=0;j<2;j++)
            b[i][j] = i * 2 + j;
    print(2, b);
}

https://godbolt.org/z/zrP9TnEcP

如果你只使用方形二维数组,你可以使用这个宏:

#define print(a) _Generic((a), int(*)[]: printfi, float(*)[]: printff)(sizeof *(a) / sizeof **(a), a)

它会自己计算长度。用 print(a);print(b); 调用它。

https://godbolt.org/z/xP918sn1s

当你使用 **(a) 作为 _Generic 的第一个参数时,它会更容易:

#define print(a) _Generic(**(a), int: printfi, float: printff)(sizeof *(a) / sizeof **(a), (a))

https://godbolt.org/z/TzrY1G4ev

关于c - 我想在 C 中为二维数组创建一个通用选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68859344/

相关文章:

关于返回静态缓冲区指针的函数的 C11 线程安全

c - fgets 和 sscanf

c - 如何在 EFI 图形模式下使用文本?

c# - 将 DataGridView 绑定(bind)到 List<T> 不显示数据

c# - 使用 GetType().Name 在事件处理程序中转换发件人对象

c# - 如何在我的程序中使用 .NET 类型字符串?

c++ - 在进入 OpenGL/Direct3D 之前学习 3d 软件光栅化和理论有什么好处?

java - 实例化抽象类的通用扩展

java - 对类型删除和桥接方法感到困惑

java - 为什么这个 Java 方法通过声明的类型而不是运行时类型进行多态化?