使用头文件 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 的答案。
我在头文件中创建结构类型 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 的答案。