使用头文件C中定义的Structs

时间:2015-02-17 15:03:41

标签: 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;
};

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

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

    int initateProgram(){
        struct person temp;
    }

它给我一个错误说

  

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

这让我相信,由于某种原因,menu.c无法访问data.h,或者我声明结构错误,任何见解都是值得赞赏的

修改

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

  

gcc -o a2 uni_personal.c menu.c

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

编辑2

我仍然得到错误,但是当我简化程序时,它就会消失,显然错误与此特定代码无关

2 个答案:

答案 0 :(得分:9)

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

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

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

union

答案 1 :(得分:2)

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

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

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