i have an error:"incomplete definition of type "struct Bird""

i have an error:"incomplete definition of type "struct Bird""

#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <limits.h>
#include <stdlib.h>
#include <math.h>
#include <sys/io.h>
#include <fcntl.h>
    
int main(){
  struct BirdHome{
    int area;
    int height;
    int feederquantity;
    char hasNest[1];
  };
  struct Bird{
    char isRinged[1];
    char nameSpecies[50];
    int birdAgeMonths;
    struct BirdHome hom;
    char gender[1];
  };

  struct Bird sparrow;
  strcpy(sparrow.isRinged,"T");
  strcpy(sparrow.nameSpecies,"sparrow");
  sparrow.birdAgeMonths=4;
  sparrow.hom.area=30;
  sparrow.hom.height=20;
  sparrow.hom.feederquantity=2;
  strcpy(sparrow.hom.hasNest,"F");
  strcpy(sparrow.gender,"M");
  printBird(&sparrow);
  return 0;
}



void printBird(struct Bird *bird){
  printf("Bird info:\n");
  printf("\tIs bird ringed:%s\n", (*bird).isRinged);
  printf("\tThe name of the specie:\n",(*bird).nameSpecies);
  printf("\tThe birds age is:%d\n",(*bird).birdAgeMonths );
  printf("Bird house info:\n");
  printf("\tArea of its house is:%d\n",(*bird).hom.area);
  printf("\tThe height of its house is:%d\n",(*bird).hom.height);
  printf("\tThe quantity of feeders is:%d\n",(*bird).hom.feederquantity );
  printf("\tThe house has nest:%s\n",(*bird).hom.hasNest );
  printf("\tBird's gender is:%s\n",(*bird).gender );
}

我已经尝试添加任何可能的库(你可以在代码中看到它),但是编译代码时仍然会出现错误。好吧,如果我们在主函数中重新编码函数(使用所有经过编辑的代码),它会正常工作,但我希望它与一个单独的函数一起工作。你能帮我吗?

类型 struct Bird 的范围是函数 main 的外部块范围。

int main(){
  struct BirdHome{
    int area;
    int height;
    int feederquantity;
    char hasNest[1];
  };
  struct Bird{
    char isRinged[1];
    char nameSpecies[50];
    int birdAgeMonths;
    struct BirdHome hom;
    char gender[1];
  };

  //...

因此在函数 main 之外,类型 struct Bird 未声明且未定义。

然而,在函数 printBird 的定义中,应该在函数 main 之前声明,您试图使用结构的数据成员,尽管在此范围内声明了 struct Bird in main 未声明且未定义。

void printBird(struct Bird *bird){
  printf("Bird info:\n");
  printf("\tIs bird ringed:%s\n", (*bird).isRinged);
  //..

就是你在函数参数列表中声明了不完整的类型struct Bird

void printBird(struct Bird *bird){
               ^^^^^^^^^^^

这与在 main 中声明的 struct Bird 没有任何共同之处。

main 移动结构定义,使其定义可用于函数 printBird。然后将函数声明放在函数 main.

之前

此外,由于结构类型的对象是通过引用传递给函数的,并且在函数中没有被更改,因此您应该使用限定符 const

void printBird( const struct Bird *bird);

注意这个调用

strcpy(sparrow.isRinged,"T");

调用未定义的行为,因为数组 isRinged 不够大,无法存储字符串文字“T”,该字符串文字在内部表示为具有两个元素的字符数组 { 'T', '[=27=]' }.

你至少应该这样声明

char isRinged[2];

这些语句存在同样的问题

strcpy(sparrow.hom.hasNest,"F");
strcpy(sparrow.gender,"M");

您需要扩大使用的字符数组。