[英]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};
我已经宣布了 function:
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);
^
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
由于这个 typedef 声明
typedef float mat[4][4];
arrays 声明喜欢
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};
在这种情况下,function 应该声明为
void get_input( float ( ** matrices)[4] );
并称呼
get_input( matrices );
或者喜欢
mat *matrices[3] = { &MAT_A, &MAT_B, &MAT_C };
在最后一种情况下,function 被称为
get_input( matrices );
还有 function get_input
声明为
void() get_input(mat** matrices);
实际上相当于
void() get_input( float ( ** matrices )[4][4]);
但在 function 的这个电话中
get_input(&matrices);
参数具有类型
float( * ( * ) [3])[4][4]
改变
mat *matrices[3] = {MAT_A, MAT_B, MAT_C};
到
mat *matrices[3] = {&MAT_A, &MAT_B, &MAT_C};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.