【问题标题】:C99/C11 Self-referencing Sub-object Initialization possible?C99/C11 自引用子对象初始化可能吗?
【发布时间】:2018-11-28 16:24:07
【问题描述】:

我首先应该说我不认为我想做的事是可能的(阅读了我认为是 ISO C99 的相关部分),但这里是我现在所拥有的粗略概念:

struct foo {
    int x;
    int *y;
};

#define FOO_INITIALIZER(name) \
{                             \
    .x = 1,                   \
    .y = &(name).x,           \
}

struct foo bar = FOO_INITIALIZER(bar);

这在 C99/C11 中有效,但我真正想要的是将 name 参数放到 FOO_INITIALIZER 宏中。这可能吗?

我知道这行不通:

#define FOO_INITIALIZER       \
{                             \
    .x = 1,                   \
    .y = &.x,                 \
}

如果可能的话,我应该查看 ISO/IEC 9899:TC3 的哪个部分?

【问题讨论】:

  • 与上面非常相似,但它确实有一个好处:不需要输入两次名称。看起来这是当前 C(或未来 C,因为我怀疑 WG14 会在标准中添加自引用)可以做到的最好的。

标签: c c99 c11 subobject


【解决方案1】:

没有办法在标准 C 语言中实现您想要的。您可以通过offsetof 继续传递名称(但这不适用于嵌套对象)或存储偏移量而不是指针(高度依赖于应用程序)。

【讨论】:

  • 我就是这么想的。感谢您的确认。在我放弃我所追求的宏语法之前,我想我会问 stackoverflow。
猜你喜欢
  • 1970-01-01
  • 2021-01-02
  • 2021-11-22
  • 2013-05-29
  • 2020-08-10
  • 2018-08-02
  • 1970-01-01
  • 2013-06-27
  • 2019-12-01
相关资源
最近更新 更多