首页 > 解决方案 > C99/C11 自引用子对象初始化可能吗?

问题描述

我首先应该说我认为我想做的事情是不可能的(已经阅读了我认为是 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 的哪个部分?

标签: cc99c11subobject

解决方案


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


推荐阅读