C宏返回一个Struct

时间:2019-02-05 19:40:24

标签: c struct macros

有没有一种方法可以使宏完全执行此功能?我是C的新手,感谢您的帮助!

vector vectorScale(float c, vector *v){
    vector result = {v->x * c, v->y * c, v->z * c };
    return result;
}
typedef struct{
    float x,y,z;
}vector;

我目前正在尝试此操作,但出现错误:

#define vectorScale(vector v, vector c)    vector {float (v->x * c); float (v->y * c); float (v->z * c); }

2 个答案:

答案 0 :(得分:5)

宏参数没有类型。您想要:

#define vectorSub(c,v) {(v)->x * (c), (v)->y * (c), (v)->z * (c) } 

这是最好的等效条件,除非有人这样​​调用您的宏:

vector v2 = vectorSub(i++,v);

这是宏多次使用其参数的常见问题,因为它将扩展为:

{(v)->x * (i++), (v)->y * (i++), (v)->z * (i++) }

完成独立的编译示例:

typedef struct  {
  float x,y,z;
} vector;

#define vectorSub(c,v) {(v)->x * (c), (v)->y * (c), (v)->z * (c) } 

vector foo()
{
  vector v = {0,3,4};
  vector v2 = vectorSub(12,&v);
  return v2;
}

请注意,优秀的编译器可以/将内联这样的简短函数,例如原始的vectorScale,特别是如果使用inline关键字向编译器发送提示时(编译器不一定符合要求)并且该函数位于头文件中,因此宏并不是此处的最佳选择,特别是因为它们不涉及诸如令牌粘贴或字符串之类的宏技巧。

答案 1 :(得分:5)

#define vectorScale(c, v) \
    ((vector) {(v)->x * (c), (v)->y * (c), (v)->z * (c) })

此构造形式为(type) { initial values },称为复合文字。它是type的对象。

但是,对于一个不错的编译器,它应该可以使用静态内联函数:

static inline vector vectorScale(float c, vector *v)
{
    return (vector) {v->x * c, v->y * c, v->z * c };
}

一个好的编译器应对此进行优化,使其效率与宏一样高,并且可以避免vc是带有副作用的表达式的问题。