ANSI C GCC C90 中矩阵数组指针的警告

Warnings of Pointer to array of matrices In ANSI C GCC C90

我在 Linux 中收到奇怪的警告。 在 Windows 上的 Visual Studio 中,代码编译并运行良好,但我需要使用 GCC c90 编译它,我收到这些警告:

我已经像这样初始化了矩阵:

typedef float mat[4][4];

现在我想创建一个矩阵数组:

mat MAT_A = { 0 };
mat MAT_B = { 0 };
mat MAT_C = { 0 };
mat *matrices[3] = {MAT_A, MAT_B, MAT_C};

我已经声明了函数:

void get_input(mat** matrices);

并使用它:

get_input(&matrices);

代码运行良好,但我需要用 gcc c90 编译它。 我收到此警告:

warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]  
mat *(*matrices)[3] = {MAT_A, MAT_B, MAT_C};                     
                       ^~~~~

warning: passing argument 1 of ‘get_input’ from incompatible pointer type [-Wincompatible-pointer-types]
    flag = get_input(&matrices);
                     ^

由于这个 typedef 声明

typedef float mat[4][4];

数组声明为

mat MAT_A = { 0 };

被隐式转换为其声明中的第一个元素

mat *matrices[3] = {MAT_A, MAT_B, MAT_C};

类型 float( * )[4]。但是变量矩阵被声明为具有元素类型float ( * )[4][4]。这些类型不兼容。

那实际上你有下面的声明

float ( *matrices[3] )[4][4] = {MAT_A, MAT_B, MAT_C};

你应该像

那样声明数组
float ( *matrices[3] )[4] = {MAT_A, MAT_B, MAT_C};

在这种情况下,函数应该声明为

void get_input( float ( ** matrices)[4] );

并称赞

get_input( matrices );

或喜欢

mat *matrices[3] = { &MAT_A, &MAT_B, &MAT_C };

在最后一种情况下函数被调用为

get_input( matrices );

还有函数get_input声明为

void() get_input(mat** matrices);

实际上相当于

void() get_input( float ( ** matrices )[4][4]);

但是在这个函数的调用中

get_input(&matrices);

参数的类型为

float( * ( * ) [3])[4][4]

mat *matrices[3] 是一个包含 3 个指向 mat 的指针的数组。所以需要用 指向 mat.

的指针来初始化它
mat *matrices[3] = {&MAT_A, &MAT_B, &MAT_C};

此外,当调用get_input(&matrices);时,&matrices是一个指向数组的指针,其中包含3个指向mat的指针。这不是get_input()所期望的,什么是指向mat的指针。只需使用:

get_input(matrices);

表达式 matrices 被转换为指向其第一个元素的指针,该元素是指向 mat 的指针。结果,表达式的类型是指向 mat 的指针,这正是 get_input 所期望的。

现在代码编译时没有警告。参见 https://godbolt.org/z/84qd4rrnx

改变

mat *matrices[3] = {MAT_A, MAT_B, MAT_C};

mat *matrices[3] = {&MAT_A, &MAT_B, &MAT_C};