我有一个一维数组int *data
,我知道有效存储在其中的rows
和cols
的数量。也就是说,我可以使用类似(i,j)
的内容访问二维矩阵data[i*cols+j]
的元素。
具体来说,它们存储在struct:
中typedef struct {
int *data;
int rows;
int cols;
} matrix_t;
在过去的某个时刻,我也写了这个伏都教代码:
#define MATRIXP(m) __typeof__(__typeof__(__typeof__(*((m).data))[(m).cols]) *)
#define MATRIXD(m) ((MATRIXP(m)) ((m).data))
通过这些定义,我能够做到:
MATRIXP(matrix) m = MATRIXD(matrix);
然后我可以使用矩阵m
作为二维矩阵指针来访问data
。
m[3][2] = 5; /* assign the element in row 3 and column 2 */
这非常好,意味着我不需要记住总是有一个像data[i*cols+j]
这样的表达式。但是,我不久前写了这段代码,现在我不记得它是如何工作的。
有人可以准确解释所有__typeof__
运算符的工作原理,以及如何阅读类似的表达式?变量m
的类型是什么?
我知道它扩展为:
__typeof__(__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *) m = ((__typeof__(__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *)) ((matrix).data));
这种访问data
的方法是否安全?这是最好的方法吗?
答案 0 :(得分:5)
问题1:
MATRIXP(matrix) m
(matrix
应该是matrix_t
类型的变量)将扩展为
__typeof__(__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *) m
从一侧到另一侧
__typeof__(*((matrix).data))
是[{1}}的类型,根据*((matrix).data)
的定义为int
。
因此matrix_t
等于(__typeof__(*((matrix).data))[(matrix).cols])
因此(int [cols])
等于__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *)
这是(int [cols] *)
给出的类型。
因此,MATRIXP(matrix)
等于MATRIXP(matrix)
。换句话说,
(int [(matrix).cols] *)
实际上是
MATRIXP(matrix) m
正如@codebeard所指出的
问题2:
对我来说看起来很安全。