純粋なC(C ++からのもの)を学ぶために、構造体とマクロを使用して単純な数学ライブラリを作成することにしました。
これまでのところ、私はこれをテストマクロとして持っています:
#define MulVec2(dest,src) ((dest.x) = (dest.x) * (src.x); (dest.y) = (dest.y) * (src.y); return dest;)
typedef struct vec2f_s
{
float x, y;
}
vec2f_t;
私の呼び出しコードには、次のようなものがあります。
int main(void)
{
vec2f_t v, w;
v.x = 5.0f;
v.y = 2.0f;
w.x = 3.0f;
w.y = 3.0f;
v = MulVec2(v, w);
printf( "x => %f; y => %f \n", v.x, v.y );
return 0;
}
私の質問は次のとおりです。
1)オブジェクトのポインタ/アドレスをマクロに渡すために別のマクロを作成する必要がありますか?もしそうなら、どのように?たとえば、MulVec2(dest,src)
マクロは渡されたオブジェクトが動的に割り当てられていないことを前提としていることに注意してくださいが、それもサポートしたいと思います。
2)コードをコンパイルすると、次のエラーが発生します。
../main.c: In function 'main':
../main.c:15:9: error: expected ')' before ';' token
../main.c:15:7: error: incompatible types when assigning to type 'vec2f_t' from type 'float'
これを修正するにはどうすればよいですか?
編集
このためにマクロだけを使用する予定はないことを明確にする必要がありますが、マクロを作成する理由は、ベクトルのdoubleとfloatのバリエーションに対して個別の関数を作成する必要がないためです。DRY(繰り返さないでください)の原則に従って、可能な限り再利用できるようにしたいと思います。