2

以下のコードをコンパイルすると、エラーなしで実行されます。

#include<stdio.h>
struct adjacency
{
    struct node* dest;
    struct adjacency* link;
};
struct node
{
    char nodename;
    struct node* next;
    struct adjacency* adj;
};
int main( void )
{
    //code
}

しかし、なぜですか?構造体隣接内で使用される前に構造体ノードを定義していないため、コンパイルエラーが表示されるはずだと思います..しかし、それは完全に問題なく実行されています..考えられる理由は何ですか?

4

2 に答える 2

2

コードに問題はありません。struct node内部にadjacencyは、 という名前の構造体があり、へのポインタを保持しているnodestruct node*言います。ポインターを宣言するために、完全な型 (定義が表示されていない型の正式な用語) は必要ありません。メンバーがいる場合、エラーが発生します。adjacencystruct nodeadjacencystruct node link;

于 2013-11-10T18:36:15.723 に答える
1

C++ では、不完全な型への ポインターを使用できます。struct node *destまさにそのような獣です。への前方参照がありstruct nodeますが、その型へのポインタを宣言しているだけなので、コンパイラは気にしません。これは明示的に許可されており、相互に参照する構造を構築できます。

C++ で相互に参照する 2 つのクラスまたは構造体が必要であるが、宣言でstructorclassキーワードを使用したくない場合は、暫定的な宣言を行うことができます。

struct node;       // Incomplete type, but makes `node` known to compiler as a struct.
struct adjacency;  // Incomplete type, but makes `adjacency` known to compiler as a struct.

struct adjacency
{
    node *dest;
    adjacency *link;
};

struct node
{
    char nodename;
    node *next;
    adjacency *adj;
};

文体ガイド: 型ではなく、変数名の横に * を付けます。それがコンパイラーの見方であり、後で のようなものを書いたときに混乱を避けることができstruct node* next, prev;ますprev。それを書く慣用的な方法はstruct node *next, *prev;.

于 2013-11-10T18:37:06.667 に答える