为什么结构的前向声明在我的代码中不起作用?什么时候可以在C中使用?

问题描述 投票:0回答:3

前向声明,无论是结构体还是函数,不是应该做前向声明所期望的事情,即让我们在定义之前使用

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;
};
c struct sizeof structure forward-declaration
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
文件很大,这可以显着加快编译速度。


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

 是不完整类型,则
无法工作。 您(通常)只能将pointers用于不完整的类型。 在这种情况下,这可能意味着创建一个分配并返回指向新结构的指针的函数,而不是尝试在堆栈上声明和初始化一个指针。


2
投票

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

换句话说,

sizeof

需要完整的类型。您的前向声明的结构类型不是完整类型。运算符

->
还需要左侧的完整类型。对象定义(如
struct test x
)也需要完整的类型。
    

© www.soinside.com 2019 - 2024. All rights reserved.