【问题标题】:Can I convert a structure pointer to point to an initial anonymous member in C1x? Is this even the right question?我可以将结构指针转换为指向 C1x 中的初始匿名成员吗?这甚至是正确的问题吗?
【发布时间】:2011-08-03 09:29:26
【问题描述】:

我对 C1x 中的匿名结构有点困惑。适当转换的结构指针指向它的第一个成员的规则是否适用于初始匿名结构,或者仅适用于初始匿名结构的初始成员?特别是,这个程序在 C1x 中有意义吗?

#include<stdio.h>

struct node {
    struct node *next;
};

/* Does C1x even allow this? Do I have to define struct node inside of inode?
 * Are anonymous struct members even allowed to have tags?
 */
struct inode {
    struct node;
    int data;
};

int main(void) {
    inode node1 = {NULL, 12};
    inode *ihead = &inode;
    node *head = (struct node *)ihead;

    /* These should work since struct inode's first member is a struct node. */
    printf("Are these equal? %c", head == &node1.next ? 'Y' : 'N');
    printf("Is next NULL? %c", head->next == NULL ? 'Y' : 'N');

    return 0;
}

This 的回答表明我可能在询问未命名的结构而不是匿名结构。我是否完全误解了匿名结构的性质?

【问题讨论】:

  • 当我再次关闭手机时,我会尝试查找答案。与此同时,我加了一个赏金。我不应该宽恕这种行为,但看看你是否能找到一些方法来解决这个问题或引起人们的注意。我想知道答案。

标签: c pointers structure language-features c11


【解决方案1】:
/* Does C1x even allow this? Do I have to define struct node inside of inode?
 * Are anonymous struct members even allowed to have tags?
 */
struct inode {
    struct node;
    int data;
};

首先,struct node 成员不是匿名。它是未命名的,但是因为它有一个标签(node),所以它不满足“匿名”的C1x定义。

除此之外,C1x 语法显然允许这样做。由于 SO 并不真正支持下标,因此我用方括号标记了可选元素;我还省略了不需要证明这是有效的语法规则:

type-specifier:
    struct-or-union-specifier
struct-or-union-specifier:
    struct-or-union [identifier] { struct-declaration-list }
struct-or-union:
    struct
    union
struct-declaration-list:
    struct-declaration
    struct-declaration-list struct-declaration
struct-declaration:
    specifier-qualifier-list [struct-declarator-list];
specifier-qualifier-list:
    type-specifier [specifier-qualifier-list]

还有 4 个约束需要满足,但没有一个适用于未命名的成员,因此这在语法上是有效的 C。

现在,谈谈你真正的问题。 C1x 说:

一个指向结构对象的指针,经过适当转换,指向其初始成员 (...),反之亦然。

句号。没有“除非该成员未命名”。所以指向node1的指针也是指向未命名初始成员的指针,也是指向node1.next的指针。然而,在这里它开始变得有点毛茸茸。可能是我忽略了一个子句,但 C1x 似乎只说:

匿名结构或联合的成员被视为包含结构或联合的成员。

我找不到将未命名结构的成员视为包含结构的成员的语言。实际上,除了指针双关语之外,没有保证可以访问next 的方法。我会写信给委员会的一些人,要求澄清这一点。

你也可能在初始化时遇到麻烦:

结构对象的未命名成员即使在初始化后也具有不确定的值。

【讨论】:

  • +1 我愿意给你赏金(在 11 小时内,除非有更好的结果出现)只是为了编写标准委员会。不过,如果他们回信,请更新此内容。我非常好奇这个(非常方便的)构造是要成为功能还是保持“扩展”。
  • 那么,委员会是否对此做出了裁决?
【解决方案2】:

尝试使用节点作为类型名称。避免再次声明“结构节点”。

struct inode {
    node n;//node is a already a defined type name, n is the var name
    int data;
};

【讨论】:

  • 我意识到这已经晚了,但我相信你被否决了,因为这是一个 C 问题而不是 C++ 问题。为了使节点成为 C 中的类型名称,它必须是 typedef'd。
猜你喜欢
  • 2018-07-28
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 2018-08-08
  • 2014-02-19
  • 2021-08-05
  • 1970-01-01
相关资源
最近更新 更多