gpt4 book ai didi

c - 使用 (void *) 作为通用数据容器时的左值问题

转载 作者:太空宇宙 更新时间:2023-11-04 05:29:37 26 4
gpt4 key购买 nike

这是程序中使用的结构:

struct basic_block
{
void * aux;

/* Many other fields,
which are irrelevant. */
};

现在:

  1. basic_block 的多个实例在程序执行期间存在。
  2. 该程序分阶段/阶段运行,一个接一个地执行。
  3. 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) 本身 作为 L 值(对于 malloc),所以我使用那个宏毕竟这不是一个好主意:

/* WRONG! I cannot assign to the result of a cast:  */
MY_DATA(bb) = malloc (sizeof (struct a_long_struct_name));

我的问题:

我该怎么做才能以干净的方式引用 aux 并且仍然能够将其用作 L 值。

最佳答案

您可以将字段的地址转换为struct a_long_struct_name **,然后取消引用它:

#define MY_DATA(bb) \
(* ((struct a_long_struct_name **) &(bb)->aux) )

这将适用于您展示的两种结构。

但是,如果在声明 struct basic_block 的地方可以知道 aux 的具体类型的可能性集,那么使用 union 会更简洁:

struct basic_block
{
union {
struct a_long_struct_name *alsn;
/* etc */
} aux;

/* Many other fields,
which are irrelevant. */
};

然后

#define MY_DATA(bb) ((bb)->aux.alsn)

关于c - 使用 (void *) 作为通用数据容器时的左值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11122491/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com