C语言头文件中重复定义struct,但是我只在头文件这定义了struct阿,怎么办
//头文件
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<math.h>
#define NUM 5
#define PI 3.14
void initBall(struct BALL ball[],int num);
int moveBall(struct BALL ball[],int num);
void redrawCWin(struct BALL ball[],int num);
void delay(int nTime);
int randX(void);
int randY(void);
int randA(void);
int randC(void);
double distBetweenBalls(struct BALL ball[],int k,int i);
void initCharPicture(char cWin[24][80]);
struct BALL
{
char body[2];
int sel;
int wX;
int wY;
double X;
double Y;
double dX;
double dY;
};
//子函数
#include "head.h"
void initBall(struct BALL ball[],int num)
{
int i,j;
for(i=0;i<NUM;i++)
{
j=randA();
ball[i].body[0]='@';
ball[i].body[1]='*';
ball[i].sel=randC();
ball[i].X=randX();
ball[i].Y=randY();
ball[i].wX=(int)(ball[i].X+0.5);
ball[i].wY=(int)(ball[i].Y+0.5);
ball[i].dX=cos((j*PI)/180);
ball[i].dY=sin((j*PI)/180);
}
}
int randX()
{
int a;
a=rand()%22+1;
return a;
}
int randY()
{
int a;
a=rand()%77+1;
return a;
}
int randA()
{
int a;
a=rand()%359+1;
return a;
}
int randC()
{
int a;
a=rand()%2;
return a;
}
double distBetweenBalls(struct BALL ball[],int k, int i)
{
double dist;
dist=sqrt((ball[k].X-ball[i].X)*(ball[k].X-ball[i].X)+(ball[k].Y-ball[i].Y)*(ball[k].Y-ball[i].Y));
return dist;
}
int moveBall(struct BALL ball[],int num)
{
int i;
int t=0;//
for(i=0;i<num;i++)
{
ball[i].X+=ball[i].dX;
ball[i].Y+=ball[i].dY;
}
for(i=0;i<num;i++)
{
if(ball[i].X>23)
{
putchar('\a');
t++;
}
if(ball[i].X<0||ball[i].X>23)
{
ball[i].dX=-ball[i].dX;
ball[i].X+=ball[i].dX;
}
if(ball[i].Y<0||ball[i].Y>79)
{
ball[i].dY=-ball[i].dY;
ball[i].Y+=ball[i].dY;
}
else
{
ball[i].wX=(int)(ball[i].X+0.5);
ball[i].wY=(int)(ball[i].Y+0.5);
}
int j;
for(j=i+1;j<num;j++)
{
double dist=distBetweenBalls(ball,i,j);
if(dist<1)
{
double swap;
swap=ball[i].dX;
ball[i].dX=ball[i].dY;
ball[i].dY=swap;
if(ball[i].sel==0)
ball[i].sel=1;
else
ball[i].sel=0;
swap=ball[j].dX;
ball[j].dX=ball[j].dY;
ball[j].dY=swap;
if(ball[i].sel==0)
ball[j].sel=1;
else
ball[j].sel=0;
}
}
ball[i].wX=(int)(ball[i].X+0.5);
ball[i].wY=(int)(ball[i].Y+0.5);
}
return t;
}
void redrawCWin(struct BALL ball[],int num)
{
char cWin[24][80];
initCharPicture(cWin);
moveBall(ball,num);
int i,j;
for(j=0;j<num;j++)
cWin[ball[j].wX][ball[j].wY]=ball[j].body[ball[j].sel];
for(i=0;i<24;i++)
{
puts(cWin[i]);
}
}
void delay(int nTime)
{
int i,j;
for(i=0;i<nTime;i++)
for(j=0;j<200000;j++);
}
void initCharPicture(char cWin[24][80])
{
int i,j;
for(i=0;i<24;i++)
{
cWin[i][79]='\0';
cWin[i][0]='|';
cWin[i][78]='|';
}
for(i=1;i<78;i++)
{
cWin[0][i]='-';
cWin[23][i]='-';
}
for(i=1;i<23;i++)
{
for(j=1;j<78;j++)
{
cWin[i][j]='.';
}
}
}
//主函数
#include "head.h"
#include "Myfuncs.cpp"
#include "time.h"
void main()
{
int n;
printf("请输入弹球数目:");
scanf("%d",&n);
if(n<1)
n=1;
if(n>NUM)
n=NUM;
srand((unsigned)time(NULL));
struct BALL ball[NUM];
initBall(ball,n);
while(1)
{
delay(2000000);
redrawCWin(ball,n);
}
}
#include "Myfuncs.cpp"
实际上Myfuncs.cpp和主程序放在一起,去掉Myfuncs.cpp就可以了。
这个造成了主程序把 "Myfuncs.cpp" 的内容又写了一遍,当然重复定义了。
C语言头文件中struct类型重定义错误通常是因为在多个文件中包含了同名的结构体定义,导致重复定义。可以通过使用头文件保护宏来避免重复包含,或使用typedef来定义结构体类型的别名来避免重复定义的问题。 以下是两种解决方案:
#ifndef __HEADER_FILE_NAME_H__
#define __HEADER_FILE_NAME_H__
// 头文件内容
#endif
其中,__HEADER_FILE_NAME_H__是一个符号常量,用来保证头文件只被编译一次,避免重复定义。
例如,如果要在头文件中定义一个名为Student的结构体类型,可以按如下方式修改头文件:
#ifndef __MY_HEADER_FILE_H__
#define __MY_HEADER_FILE_H__
typedef struct
{
int id;
char name[20];
int age;
} Student;
#endif
这里使用了头文件保护宏来防止重复包含,同时使用了typedef为结构体类型Student定义了一个别名。
例如,如果要在头文件中定义一个名为Student的结构体类型,可以按如下方式修改头文件:
typedef struct
{
int id;
char name[20];
int age;
} Student;
这里直接使用了typedef为结构体类型Student定义了一个别名。在其他文件中使用Student时,只需要包含该头文件即可。
总结: C语言头文件中struct类型重定义错误通常是因为在多个文件中包含了同名的结构体定义,可以通过头文件保护宏或typedef来避免重复定义的问题。在定义结构体类型时,建议使用typedef为其定义一个别名,方便后续使用。