C语言struct type redifinition

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" 的内容又写了一遍,当然重复定义了。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    C语言头文件中struct类型重定义错误通常是因为在多个文件中包含了同名的结构体定义,导致重复定义。可以通过使用头文件保护宏来避免重复包含,或使用typedef来定义结构体类型的别名来避免重复定义的问题。 以下是两种解决方案:

    1. 头文件保护宏 在头文件中加入头文件保护宏,可以有效地避免重复定义的问题。头文件保护宏的格式一般如下所示:
    #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定义了一个别名。

    1. 使用typedef定义结构体类型别名 另一种解决方案是使用typedef来定义结构体类型的别名。通过为结构体类型定义一个别名,可以避免重复定义的问题。

    例如,如果要在头文件中定义一个名为Student的结构体类型,可以按如下方式修改头文件:

    typedef struct
    {
        int id;
        char name[20];
        int age;
    } Student;
    

    这里直接使用了typedef为结构体类型Student定义了一个别名。在其他文件中使用Student时,只需要包含该头文件即可。

    总结: C语言头文件中struct类型重定义错误通常是因为在多个文件中包含了同名的结构体定义,可以通过头文件保护宏或typedef来避免重复定义的问题。在定义结构体类型时,建议使用typedef为其定义一个别名,方便后续使用。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^