有没有一种方法可以使宏完全执行此功能?我是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); }
答案 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 };
}
一个好的编译器应对此进行优化,使其效率与宏一样高,并且可以避免v
或c
是带有副作用的表达式的问题。