错误c2371 struct <type>重新定义

时间:2016-01-26 17:43:02

标签: c syntax-error visual-studio-debugging

因此,我在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结构的存在,因为它们是typedefed,当我在我的函数中使用它们时作为参数,我将它们称为“CELL **变量”,而不是“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'{' 并且'*'

之前的C2143 SYNTAX ERROR缺少')'

发生什么事了??? !!!

1 个答案:

答案 0 :(得分:1)

标头文件应以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

这样就可以避免循环包含的鸡蛋问题:union.h包括AI.h。然后,AI.h包含union.h,但现在定义了包含保护UNION_Hunion.h中不包含任何内容。因此,递归包含在这里停止。应该提到整个头文件union.h应该被#ifndef UNION_H ... #endif包围。

出现了一个新问题:如果首先包含union.h,则AI.h包含在结构CELL的定义之前。但AI.h中的功能会在CELL**上运行!要解决此问题,请在CELL中介绍AI.h#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 转发声明 (参见C forward declaration of struct in header):< / p>

AI.h

再次,由于包含了内容,public static void nthDigitTally1(int n, int num, int tally[]){ String numString = Integer.toString(num); System.out.println(numString); System.out.println(numString.charAt(2)); for(int i = 0; i < countDigits(num); i++){ if(numString.charAt(i) == "1"){ System.out.println("It works cappin"); } } 的内容不会被包含两次。

我没有检查上面的代码。如果您的问题没有解决,请告诉我!