プログラムで使用される構造は次のとおりです。
struct basic_block
{
void * aux;
/* Many other fields,
which are irrelevant. */
};
今:
basic_block
プログラムの実行中に のインスタンスがいくつか存在します。- プログラムはステージ/パスで動作し、次々に実行されます。
- この
aux
フィールドはbasic_block
、ステージの実行中にステージと特定のデータを格納するためのものであり、ステージ自体によって解放されます (次のステージで再利用できるようになります)。これがvoid *
.
私のステージはaux
を格納するstruct
ために使用されるため、何かにアクセスするたびに、キャストを行う必要があります。
( (struct a_long_struct_name *) (bb->aux))->foo_field = foo;
さて、私の問題です。このように毎回キャストするのは苦痛であり、より複雑な式の一部であると読みにくいです。私が提案した解決策は次のとおりです。マクロを使用してキャストを行います。
#define MY_DATA(bb) \
( (struct a_long_struct_name *) (bb)->aux)
次に、次の方法でデータにアクセスできます。
MY_DATA(bb)->foo_field = foo;
しかし:私はMY_DATA(bb)
自分自身を( a の)L値として使用することはできないmalloc
ので、結局、そのマクロを使用することはあまり良い考えではありません:
/* WRONG! I cannot assign to the result of a cast: */
MY_DATA(bb) = malloc (sizeof (struct a_long_struct_name));
私の質問:
aux
クリーンな方法で参照し、それを L 値として使用できるようにするにはどうすればよいですか。