我对 C 有点陌生,所以我仍在学习绳索。我无法让预处理器宏按照我想要的方式工作。这是情况,我有一个这样的结构:

struct super {
    int data1;
    int data2;
    int condition;
};

我想创建一个这样的宏:
#define getdata(s) (s.condition ? s.data1 : s.data2)

这样我就可以做这样的事情:
getdata(s) = 4 // stores in data1 if condition, data2, if not.

但这并不完全有效。

为什么它不起作用,我该如何纠正它?

最佳答案

以这种方式改变它(三元运算符从不返回 C 中的左值):

#define getdata(s) (*((s).condition ? &(s).data1 : &(s).data2)

变化:
  • 在选项上使用地址,并在条件运算符的结果上取消引用。
  • 添加了缺少的括号。

  • 不过,请注意 s 将被评估两次。 (您可以使用内联函数或依赖于实现的魔法来解决这个问题。)
    inline int* getdata(struct super* s) {return s->condition ? &s->data1 : &s->data2;}
    #define getdata(s) (*getdata(&s))
    

    关于c - 根据宏中的条件选择结构成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26310676/

    10-11 18:25