2012-12-16 71 views
0
Error 2 error C2371: 'QixC': redefinition; different basic types line 5 
Error 5 error C2371: 'QixC': redefinition; different basic types line 5 
Error 13 error C2371: 'QixC': redefinition; different basic types line 5 

这是文件Game.h部分:C错误C2371重新定义

#include "Graphics_Console.h" 
#include <stdio.h> 
#include <conio.h> 

typedef struct 
{ 
int X; 
int Y; 
}QixC; 
typedef struct 
{ 
int X; 
int Y; 
}CCursor; 

而且我在Game.c使用它们:

#include "Game.h" 
#include <stdio.h> 
#include <conio.h> 
#include <time.h> 
int QIX(int nivell) 
{ 
QixC Qix; 
CCursor Cursor; 
HANDLE hScreen; 
int DirQixX,DirQixY; 
int IniciX,IniciY; 
int FiX, FiY; 
int DirStix=0; 
int Area=0,AreaTotal=0,AreaObjectiu=(FI_X-INICI_X)*(FI_Y-INICI_Y)*0.75; 
int Pantalla=1; 
int Puntuacio=0; 
int tecla=0; 
int viu=1; 
int NCops=0, Velocitat=1000/(nivell*0.70); 
int XocStix=0; 
char continuar[1]; 

hScreen = GetStdHandle(STD_OUTPUT_HANDLE); 
InitScreen(hScreen); 
do 
{ 
    system("CLS"); 
    IniciX=INICI_X,IniciY=INICI_Y; 
    FiX=FI_X, FiY=FI_Y; 
    Cursor.X=INICI_X+(FiX-INICI_Y)/2,Cursor.Y=FI_Y; 

    DibuixarRectangle(IniciX,IniciY,FI_X,FI_Y,hScreen); 
    InfoPuntsPartida(hScreen, Puntuacio); 
    InfoPantallaPartida(hScreen, Pantalla); 

    Qix.X=Aleatori(IniciX+1,FiX-1),Qix.Y=Aleatori(IniciY+1,FiY-1); 
    InicialitzarDirQix(&DirQixX,&DirQixY); 
    PintarQix(Qix,hScreen); 
    PintarCursor(Cursor.X,Cursor.Y,hScreen); 

    do{ 
     if(_kbhit()) 
     { 
      tecla=LlegirEvent(); 
      TractarEvent(tecla,Cursor,&IniciX,&IniciY,&FiX,&FiY,Qix,&DirStix,&Area,hScreen); 
      if(Area) 
      { 
       Puntuacio=Puntuacio+Area; 
       AreaTotal+=Area; 
       Area=0; 
       InfoPuntsPartida(hScreen,Puntuacio); 
      } 
     } 
     NCops++; 
     if(NCops==Velocitat) 
     { 
      if(DirStix!=0) 
       XocStix=QiXXocStiX(Qix,Cursor,DirStix); 
      if(!XocStix) 
       MoureQix(Qix,&DirQixX,&DirQixY,IniciX,IniciY,FiX,FiY,hScreen); 
      else 
       viu=0; 
      NCops=0; 
     } 
    }while((tecla!=TECLA_q)&&(tecla!=TECLA_Q)&&viu &&(AreaTotal<AreaObjectiu)); 
    GameOver(hScreen); 
    TextColor(LIGHTGREY,BLACK,hScreen); 
    GotoXY(0,FI_Y+1,hScreen); 
    return Puntuacio; 
    system ("PAUSE"); 
    printf("Continuar?(s/n)"); 
    scanf("%c",&continuar); 
}while(continuar!="s"); 
} 

很抱歉的外来词和名字,英语不是我的第一语言。 我看不到重新定义的位置。它们不会出现在其他地方,但会作为参数传递给某些函数。请帮忙吗?

+1

您是否使用标头警卫? –

+0

Graphics_Console.h头文件中的内容是什么? –

回答

2

请尝试防止您的头对多个包含。

#ifndef GAME_H 
#define GAME_H 

#include "Graphics_Console.h" 
#include <stdio.h> 
#include <conio.h> 

typedef struct 
{ 
    int X; 
    int Y; 
}QixC; 

typedef struct 
{ 
    int X; 
    int Y; 
}CCursor; 

#endif /* GAME_H */ 

默认情况下,如果包括多个头直接或间接包括你的头,你会得到它的结构和功能的多个竞争(如果相同)的版本。您可以通过启动你的头

#ifndef SOMETHING_UNIQUE_TO_YOUR_HEADER 
#define SOMETHING_UNIQUE_TO_YOUR_HEADER 

,并结束它

#endif /* SOMETHING_UNIQUE_TO_YOUR_HEADER */ 

这保证了所有源文件将最多包括您的结构的一个副本避免这种情况。

+0

或'#pragma once' –

+0

@DavidHeffernan:'#pragma once'是非标准的,如果编译器由于某种原因不能识别两个名称引用同一个文件,则会导致问题。 –

+0

非常感谢你,我似乎有太多“#include”的东西,程序就好像我一遍又一遍地定义了结构。 –

相关问题