使用头文件 C 中定义的结构

Using Structs defined in Header files C

我在头文件中创建结构类型 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;
};

然后当我尝试在 menu.c 文件

中声明类型为 person 的结构时
    #include "menu.h"
    #include "data.h"

    int initateProgram(){
        struct person temp;
    }

它给我一个错误说

menu.c:25:19: error: storage size of ‘temp’ isn’t known

这让我相信要么 menu.c 由于某种原因无法访问 data.h 要么我宣布结构错误任何见解都值得赞赏

编辑

在上面的代码中为联合添加了一个名称。 仍然给我错误 我正在编译它如下

gcc -o a2 uni_personal.c menu.c

uni_personal.c是在menu.c中调用函数initateProgram()的主文件 尝试在任一位置声明一个结构仍然让我出错 感谢到目前为止的帮助

编辑 2

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

你程序中struct person temp;的声明没有问题。 "storage size of ‘...’ isn’t known" 错误的原因是编译器只看到类型的前向声明,而不是实际定义。另一方面,您的代码是完全有效的,假设您的 menu.c 文件中包含的 "data.h" 文件是您在 post 顶部显示的文件。您可以通过 运行 仅检查编译器的预处理器状态并检查输出来检查是否属于这种情况。这可以通过传递特定于编译器的标志(-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
};

您显示的代码没有任何问题,但您确保编译正确。假设使用 gcc 编译器,要么启用 gcc 扩展,要么将代码编译为标准 C(强烈推荐):

gcc -std=c11 -pedantic-errors -Wall -Wextra

如果您使用的是旧版本的标准,例如 C90 或 C99,请查看 dasblinkenlight 的答案。