0

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);
}

私が読んだことから、これはうまくいくはずです。あるいは、おそらく明らかな何かが欠けているかもしれません...しかし、私が何をすべきか理解していないという次のエラーが表示されます:

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);

動作しますが、理由はまだわかりません。

4

1 に答える 1

8

これはマクロとは何の関係もありません。このマクロを手動で展開しても問題は解決しません。これが失敗する理由は、代入の初期化子リストは定数式p1.xで構成されている必要があるため、許可されていないためです。

C99を使用している場合は、次のように複合リテラルを使用するようにマクロを変更します

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

これにより、マクロを割り当てと初期化子で使用できるようになります。

于 2012-06-19T16:19:40.553 に答える