这是程序中使用的结构:
struct basic_block
{
void * aux;
/* Many other fields,
which are irrelevant. */
};
现在:
basic_block
在程序执行期间存在几个实例。- 该程序分阶段/通过,一个接一个地执行。
- 该
aux
字段用于在阶段basic_block
执行期间存储阶段和特定数据,并由阶段本身释放(以便下一阶段可以重用它)。这就是为什么它是一个void *
.
我的舞台用来aux
存储 a 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)
自身用作 L 值(对于 a malloc
),所以我使用该宏毕竟不是一个好主意:
/* WRONG! I cannot assign to the result of a cast: */
MY_DATA(bb) = malloc (sizeof (struct a_long_struct_name));
我的问题:
我该怎么做才能以aux
干净的方式引用并且仍然能够将其用作 L 值。