error c2371 struct <type> 重新定义
error c2371 struct <type> redefinition
因此,我在 Visual studio 中多次收到上述错误。这是我的代码:
Union.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef AI_H
#define AI_H
#include "AI.h"
#endif
#ifndef UI_H
#define UI_H
#include "UI.h"
#endif
typedef struct BOARD_CELL {
int player, wall, steps;
}CELL;
typedef struct {
int x, y;
}COORD;
AI.h
#include "union.h"
void pathfind(CELL **a, int n);
void ai(CELL **a);
void genmove(CELL **a);
UI.h
#include "union.h"
void cmdtoAct(char* c, CELL **a, char player_counter, COORD white_vertex, COORD black_vertex);
void placeWall( CELL **a, char* str, char* str2, int n);
void playmove( CELL **a, char *colour, char *vertex, COORD player_vertex);
int pathCheck( CELL **a);
void showBoard( CELL **a);
void backdoor();
char* getCmd();
关于 .c 文件,你需要知道的是,它们中的每一个都必须知道 CELL 结构和 COORDS 结构的存在,并且因为它们是类型定义的,所以当我在我的函数作为参数,例如我称它们为 "CELL **variable",而不是 "struct CELL **variable".
编辑:我像这样为 ai.h 和 ui.h 添加了守卫:
AI.h
#ifndef AI_H
#define AI_H
#include "union.h"
#endif
void pathfind(CELL **a, int n);
void ai(CELL **a);
void genmove(CELL **a);
UI.h
#ifndef UI_H
#define UI_H
#include "union.h"
#endif
void cmdtoAct(char* c, CELL **a, char player_counter, PLAYER white, PLAYER black);
void placeWall( CELL **a, char* str, char* str2, int n);
void playmove( CELL **a, char *colour, char *vertex, PLAYER player);
int pathCheck( CELL **a);
CELL **boardsize(struct CELL **a, int size);
void showBoard( CELL **a);
void backdoor();
char* getCmd();
现在我收到 C2143 SYNTAX ERROR MISSING '{' before '*'
并且 C2143 语法错误在“*”
之前缺少“)”
这是怎么回事???!!!
头文件应以 include guards 开头。例如,union.h
看起来像:
#ifndef UNION_H //include guard
#define UNION_H //include guard
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "AI.h"
#include "UI.h"
typedef struct BOARD_CELL {
int player, wall, steps;
}CELL;
typedef struct {
int x, y;
}COORD;
#endif //include guard
这样就避免了 egg-chiken 循环包含问题:union.h
包含 AI.h
。然后 AI.h
包含 union.h
但现在定义了包含保护 UNION_H
并且 union.h
中没有包含任何内容。因此,递归包含在这里停止。应该提到的是,整个头文件 union.h
应该包含在 #ifndef UNION_H ... #endif
.
中
出现了一个新问题:如果首先包含 union.h
,则 AI.h
会在结构 CELL
的定义之前包含。但是 AI.h
中的函数在 CELL**
上运行!为了解决这个问题,让我们引入前向声明 of CELL
in AI.h
(见C forward declaration of struct in header) :
#ifndef AI_H
#define AI_H
#include "union.h"
//forward declaration of struct CELL
struct BOARD_CELL;
typedef struct BOARD_CELL CELL;
void pathfind(CELL **a, int n);
void ai(CELL **a);
void genmove(CELL **a);
#endif
再次感谢include guard,AI.h
的内容不会被包含两次。
我没有检查上面的代码。如果您的问题没有解决,请告诉我!
因此,我在 Visual studio 中多次收到上述错误。这是我的代码: Union.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef AI_H
#define AI_H
#include "AI.h"
#endif
#ifndef UI_H
#define UI_H
#include "UI.h"
#endif
typedef struct BOARD_CELL {
int player, wall, steps;
}CELL;
typedef struct {
int x, y;
}COORD;
AI.h
#include "union.h"
void pathfind(CELL **a, int n);
void ai(CELL **a);
void genmove(CELL **a);
UI.h
#include "union.h"
void cmdtoAct(char* c, CELL **a, char player_counter, COORD white_vertex, COORD black_vertex);
void placeWall( CELL **a, char* str, char* str2, int n);
void playmove( CELL **a, char *colour, char *vertex, COORD player_vertex);
int pathCheck( CELL **a);
void showBoard( CELL **a);
void backdoor();
char* getCmd();
关于 .c 文件,你需要知道的是,它们中的每一个都必须知道 CELL 结构和 COORDS 结构的存在,并且因为它们是类型定义的,所以当我在我的函数作为参数,例如我称它们为 "CELL **variable",而不是 "struct CELL **variable".
编辑:我像这样为 ai.h 和 ui.h 添加了守卫: AI.h
#ifndef AI_H
#define AI_H
#include "union.h"
#endif
void pathfind(CELL **a, int n);
void ai(CELL **a);
void genmove(CELL **a);
UI.h
#ifndef UI_H
#define UI_H
#include "union.h"
#endif
void cmdtoAct(char* c, CELL **a, char player_counter, PLAYER white, PLAYER black);
void placeWall( CELL **a, char* str, char* str2, int n);
void playmove( CELL **a, char *colour, char *vertex, PLAYER player);
int pathCheck( CELL **a);
CELL **boardsize(struct CELL **a, int size);
void showBoard( CELL **a);
void backdoor();
char* getCmd();
现在我收到 C2143 SYNTAX ERROR MISSING '{' before '*' 并且 C2143 语法错误在“*”
之前缺少“)”这是怎么回事???!!!
头文件应以 include guards 开头。例如,union.h
看起来像:
#ifndef UNION_H //include guard
#define UNION_H //include guard
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "AI.h"
#include "UI.h"
typedef struct BOARD_CELL {
int player, wall, steps;
}CELL;
typedef struct {
int x, y;
}COORD;
#endif //include guard
这样就避免了 egg-chiken 循环包含问题:union.h
包含 AI.h
。然后 AI.h
包含 union.h
但现在定义了包含保护 UNION_H
并且 union.h
中没有包含任何内容。因此,递归包含在这里停止。应该提到的是,整个头文件 union.h
应该包含在 #ifndef UNION_H ... #endif
.
出现了一个新问题:如果首先包含 union.h
,则 AI.h
会在结构 CELL
的定义之前包含。但是 AI.h
中的函数在 CELL**
上运行!为了解决这个问题,让我们引入前向声明 of CELL
in AI.h
(见C forward declaration of struct in header) :
#ifndef AI_H
#define AI_H
#include "union.h"
//forward declaration of struct CELL
struct BOARD_CELL;
typedef struct BOARD_CELL CELL;
void pathfind(CELL **a, int n);
void ai(CELL **a);
void genmove(CELL **a);
#endif
再次感谢include guard,AI.h
的内容不会被包含两次。
我没有检查上面的代码。如果您的问题没有解决,请告诉我!