使用头文件C中定义的Structs

que*_*ing 2 c struct

我在头文件data.h中创建结构类型

 struct student{
    float tutFee;
};
struct employees{
    float salary;
};
struct person{
    char firstName[10];
    char type; //s for student //e for employee
    union {
        struct student student;
        struct employees employ;
    }/*EDIT ->*/common;
};
Run Code Online (Sandbox Code Playgroud)

然后,当我尝试在menu.c文件中声明类型为person的结构时

    #include "menu.h"
    #include "data.h"

    int initateProgram(){
        struct person temp;
    }
Run Code Online (Sandbox Code Playgroud)

它给我一个错误的说法

menu.c:25:19:错误:'temp'的存储大小未知

这导致我相信menu.c由于某种原因无法访问data.h或我声明结构错误任何洞察力被赞赏

编辑

在上面的代码中为union添加了一个名称.还在给我一个错误,我正在编译它如下

gcc -o a2 uni_personal.c menu.c

uni_personal.c是在menu.c中调用函数initateProgram()的主文件.尝试在任一位置声明一个struct仍然会出错我感谢你的帮助

编辑2

我仍然得到错误,但当我简化程序时,它消失了,显然错误与这个特定的代码无关

das*_*ght 9

struct person temp;您的计划中的声明没有任何问题."存储大小'...'的原因是未知的"错误是编译器只看到类型的前向声明,而不是实际的定义.另一方面,您的代码完全有效,假设"data.h"menu.c文件中包含的文件是您在帖子顶部显示的文件.您可以通过仅运行编译器的预处理器状态并检查输出来检查是否是这种情况.这可以通过传递特定-E于编译器的标志(for gcc)来实现.

在编辑问题之前:您看到了这个问题,因为您的定义union不符合编译器正在使用的C标准(C11之前),因为该union成员没有名称.在C11之前,一些编译器(如gcc)支持匿名联合作为编译器扩展.

添加名称应解决C99兼容编译器的问题:

struct person{
    char firstName[10];
    char type; //s for student //e for employee
    union {
        struct student student;
        struct employees employ;
    } common; // <<== Here
};
Run Code Online (Sandbox Code Playgroud)