1

VSプロジェクトには次のファイルがあります。

// list.h

#include "node.h"

typedef struct list list_t;

void push_back(list_t* list_ptr, void* item);


// node.h

typedef struct node node_t;


// node.c

#include "node.h"

struct node
{
   node_t* next;
};


// list.c

#include "list.h"


struct list
{
    node_t* head;
};

void push_back(list_t* list_ptr, void* item)
{
   if(!list_ptr)
       return;

   node_t* node_ptr; // Here I have two compiler errors
}

コンパイラエラーがあります:コンパイラエラーC2275コンパイラエラーC2065

なんで?この問題を解決するにはどうすればよいですか?

4

1 に答える 1

1

プリプロセッサが行を処理した後の list.h は次のようになり#includeます (一部のコメントは除外されています)。

// list.h 

typedef struct node node_t;

typedef struct list list_t; 

void push_back(list_t* list_ptr, void* item); 

このヘッダーを list.c 内で使用するとstruct node、このコンテキストで定義されていないため、コンパイラで問題が発生します。これは node.c でのみ定義されていますが、コンパイラは list.c からその定義を認識できません。

へのポインターのみを使用しているためnode_t、node.h を次のように変更してみてください。

// node.h     

struct node;
typedef struct node node_t;

これで、 というデータ型があることが事前に宣言されましたstruct node。コンパイラがtypedefs を処理してポインターを作成するには十分な情報ですが、完全に定義されていないため、型のオブジェクトを宣言したり、ポインターstruct nodeを逆参照したりすることはできません。struct node

于 2012-07-10T16:31:41.867 に答える