带有{}的C宏

时间:2012-06-19 16:13:13

标签: c macros compiler-errors

我在C中定义了以下结构:

typedef struct point{
    float x;
    float y;
    float z;
} Point;
typedef Point Vector;

和以下宏:

#define sub(p1,p2)      {p1.x-p2.x,p1.y-p2.y,p1.z-p2.z}

就像这样使用:

void fun(Point p0, Point p1){
    Vector u;
    u=sub(p1,p0);
}

从我读过的内容应该可行,或者我可能会遗漏一些甚至可能很明显的东西......但是我收到以下错误,我不明白我应该做什么:< / p>

error: expected expression before '{' token

所以基本上我只想获得相同的:

struct point u={p1.x-p0.x,p1.y-p0.y,p1.z-p0.z}

我真的不知道我做错了什么...... 谢谢。

[编辑] 包含更多功能细节,以便您可以看到我认为我的错误在哪里。没有使用变量声明进行初始化,因为在更改

之后
Vector u;
u=sub(p1,p0);

Vector u=sub(p1,p0);

它有效,但我仍然不明白为什么。

1 个答案:

答案 0 :(得分:8)

这与宏无关:即使您手动扩展此宏,问题仍会存在。失败的原因是赋值中的初始化列表必须由常量表达式组成,因此不允许p1.x

如果您使用的是C99,请更改您的宏以使用compound literal,如下所示:

#define sub(p1,p2)      (Vector){p1.x-p2.x,p1.y-p2.y,p1.z-p2.z}

这将允许您在分配和初始化器中使用宏。