【发布时间】:2018-07-05 20:42:13
【问题描述】:
处理我看到的代码:
#define X(i) ((array[i]).x[0])
#define Y(i) ((array[i]).y[0])
typedef struct {
int x[2];
int y[2];
} coord_t;
coord_t* array = malloc(sizeof(coord_t)* 10);
int myX = X(5);
这使得对array 的访问几乎被X 和Y 预处理器指令硬编码。我想做的是将指针传递给预处理器指令,例如:
#define X(myarray,i) myarray[i].x[0]
其中myarray 可以是任何coord_t 指针:
coord_t* a = malloc(sizeof(coord_t)* 4);
coord_t* b = malloc(sizeof(coord_t)* 12);
int myX = X(a,1);
int myotherX = X(b,6);
我已经这样做了,它编译没有任何错误,但是我没有得到相同的结果。我的问题是,我可以这样#define X吗?
【问题讨论】:
-
没有真正遇到问题,但请注意
malloc不会初始化内存,因此int myX = X(5);是未定义的行为。此外,使用宏访问该内存会使代码晦涩难懂。 -
@Manolete 您在建议的宏中也有错字:
.X[0]应该是.x[0] -
你没有得到相同的结果,因为你的代码导致了未定义的行为,你没有初始化 malloc 返回的内存
-
@Manolete 不,原来的宏是正确的。无论如何,您都不能转换为数组类型。如果您仍然遇到问题(在解决访问未初始化内存的问题后),请发布 MCVE 以显示问题。
-
使用函数而不是宏!
标签: c c-preprocessor