前向声明,无论是结构体还是函数,不是应该做前向声明所期望的事情,即让我们在定义之前使用
structure
或 function
吗?为什么结构的前向声明在我的代码中不起作用?最让我想念的是,structs 的前向声明在 C 中到底有什么用?什么时候使用?您能给我一个小的 C 程序示例来说明这一点吗?
我的程序出现错误
error: storage size of 'x' isn't known|
。
#include<stdio.h>
struct test;
int main(void)
{
struct test x;
printf("%zu",sizeof(x)); //Gives Error
//printf("%zu",sizeof(struct test));//This fails too
}
struct test
{
int a;
char b;
};
新编辑我尝试按照Carl Noum所说的去做,但即使这样也不起作用:
#include<stdio.h>
struct test;
void foo(struct test*);
int main(void)
{
struct test x={53,'x'},*ptr=&x;
foo(ptr);
}
void foo(struct test* p)
{
printf("%d,%c",p->a,p->b);
}
struct test
{
int a;
char b;
};
编译器在编译 main 函数时必须知道结构体的布局。
如果您只有指针但没有实际类型,则前向声明很有用。
例如,如果您有一个结构体包含指向另一个结构体的指针
struct foo {
struct bar *b;
...
};
如果
bar
还包含 foo
之类的 也很重要
struct bar;
struct foo {
struct bar *b;
};
struct bar {
struct foo f;
};
在这种情况下,您必须预先声明
bar
。
前向声明通常意味着您不必将
.h
文件包含在其他 .h
文件中。如果 .h
文件很大,这可以显着加快编译速度。
功能是,结构否。
struct test
是您使用它的不完整类型。
不完整类型的一个常见用例是声明不透明类型。 在头文件中,您声明:
struct test;
还有一些仅通过指针使用
struct test
的 API:
int func1(struct test *);
struct test *func2(void);
在随附的实现中,您包含完整的声明,以便您的函数知道如何处理该结构:
struct test
{
int a;
char b;
};
void func1(struct test *t)
{
return t->a;
}
编辑:
您的新代码没有做任何不同的事情 - 您仍在尝试操作不完整的类型,但您仍然无法做到这一点。 特别是此声明:
struct test x = {53,'x'};
如果 struct test
是不完整类型,则无法工作。 您(通常)只能将pointers用于不完整的类型。 在这种情况下,这可能意味着创建一个分配并返回指向新结构的指针的函数,而不是尝试在堆栈上声明和初始化一个指针。
由前向声明声明的结构类型(即“不完整”类型)只能以有限的方式使用。将 sizeof
应用于这样的结构类型不是其中之一。最重要的是,您不能在对象定义中使用不完整类型,也不能访问不完整结构类型的数据字段。
sizeof
需要完整的类型。您的前向声明的结构类型不是完整类型。运算符
->
还需要左侧的完整类型。对象定义(如struct test x
)也需要完整的类型。