我正在通过编写国际象棋应用程序来学习C,我对循环引用有疑问。我的linkedList.h看起来像这样:
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif /* LINKEDLIST_H */
#include <stdlib.h>
#include "squares.h"
typedef struct node {
tSquare c;
struct node * next;
} node_square;
void createEmptyList(node_square* n);
int isEmptyList(node_square* n);
int insertAtBeginning(node_square** n, tSquare c);
void print_list(node_square * head);
在我的squares.h中,我希望包含linkedList.h功能,以便我可以返回受其中一方(黑色或白色)威胁的链接列表:
#ifndef SQUARES_H
#define SQUARES_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif /* SQUARES_H */
typedef struct {
int file;
int rank;
} tSquare;
node_square* listOfThreatenedSquares(tColor color); <--- undefined types in compilation time
我读过我应该使用的是前向参考;我试图使用它,以便在squares.h文件中我可以使用类型node_square和tColor(在另一个名为pieces.h的文件中定义),但无论我如何声明类型,它都无法正常工作。我想这就像是
typedef struct node_square node_square;
typedef struct tColor tColor;
在squares.h中。想法?
答案 0 :(得分:4)
我想这就像是
typedef struct node_square node_square; typedef struct tColor tColor;
这是对的 - 这确实是向前声明node_square
和tColor
的一种方式。但是,前向声明的类型被认为是不完整,因此在使用它们时需要遵循一个规则:您不能声明前向声明类型本身的变量,数组,结构成员或函数参数;只允许指针(或指向指针的指针,指向指针的指针等)。
这将编译:
node_square* listOfThreatenedSquares(tColor *color);
如果由于某种原因不希望使用指针,可以包含相应的标题,以便为编译器提供类的实际声明。