1

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;
}

この回答は、匿名の構造体ではなく、名前のない構造体について質問している可能性があることを示唆しています。匿名構造体の性質を完全に誤解していますか?

4

2 に答える 2

3
/* 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、ポインタ パンニング以外にアクセスする方法が保証されていない可能性があります。この点について説明を求めるために、委員会の何人かの人々に手紙を書きます。

初期化で問題が発生する場合もあります。

構造体オブジェクトの名前のないメンバーは、初期化後でも値が不定です。

于 2011-09-10T14:07:34.893 に答える
-1

タイプ名としてノードを使用してみてください。「structnode」を再度宣言することは避けてください。

struct inode {
    node n;//node is a already a defined type name, n is the var name
    int data;
};
于 2011-09-13T10:27:02.227 に答える