1

前向声明,无论是结构还是函数,不应该做前向声明应该做的事情,即让我们在定义它们之前使用structureor吗?function为什么结构的前向声明在我的代码中不起作用?而我最想念的主要事情是,在 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;
};

新编辑我试图按照卡尔·努姆所说的去做,但即使这样也行不通:

#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;
};
4

3 回答 3

4

编译器在编译 main 函数时必须知道结构的布局。

如果您只有一个指针但没有实际类型,则前向声明很有用。

例如,如果您有一个包含指向另一个结构的指针的结构

struct foo {
  struct bar *b;
  ...
};

bar如果还包含foo类似的内容,这也是必不可少的

struct bar;

struct foo {
  struct bar *b;
};  

struct bar {
  struct foo f;
};

在这种情况下,您必须bar预先声明。

前向声明通常意味着您不必.h在其他文件中包含.h文件。.h如果文件很大,这可以显着加快编译速度。

于 2013-05-17T21:45:11.440 回答
3

功能是的,结构没有。 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如果是不完整的类型,则无法工作。您(通常)只能使用指向不完整类型的指针。在这种情况下,这可能意味着创建一个函数来分配并返回指向新结构的指针,而不是尝试在堆栈上声明和初始化一个。

于 2013-05-17T21:43:28.387 回答
1

由前向声明(即不完整类型)声明的结构类型只能以有限数量的方式使用。适用sizeof于这样的结构类型不是其中之一。最重要的是,您不能在对象定义中使用不完整类型,也不能访问不完整结构类型的数据字段。

换句话说,sizeof需要一个完整的类型。您前向声明的结构类型不是完整的类型。运算符->还需要左侧的完整类型。对象定义(如struct test x)也需要完整的类型。

于 2013-05-17T21:50:30.810 回答