【问题标题】:Pointers with preprocessor directives带有预处理器指令的指针
【发布时间】: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 的访问几乎被XY 预处理器指令硬编码。我想做的是将指针传递给预处理器指令,例如:

#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


【解决方案1】:
#define X(myarray,i) myarray[i].x[0]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多