为什么实现文件中的C结构定义不可用?

时间:2015-07-23 11:07:43

标签: c

我举了以下例子来说明我的问题:

1)a.h声明结构

 a.h 
   struct A_Structure;
    typedef struct A_Structure *A_Structure_Ptr;

2)b.c其中实现了结构定义

 #include "a.h"

 struct A_Structure
 {
    int a;
    int b;
    int c;

 };

2)main.c调用结构

#include <stdlib.h>
#include "a.h"

int main ()
{
   struct A_Structure b;
    return 0;

}

但是,由于收到以下错误消息,我无法编译这些C代码:

>main.c(6): error C2079: 'b' uses undefined struct 'A_Structure'

有什么想法吗?预先感谢。

修改

#include <stdlib.h>
#include "a.h"

int main ()
{
   struct A_Structure *b=0;
   b=(struct A_Structure*)malloc(12);
   b->a=3;
   free(b);
    return 0;

}

我尝试以这种方式创建结构但仍然失败。

3 个答案:

答案 0 :(得分:2)

你可能需要这个:

struct A_Structure
{
    int a;
    int b;
    int c;

};

在a.h

这是定义struct s

时的典型方法

如果您正在尝试实现opaque pointer,则需要一个实例化A_Structure并返回指针的函数,以及操作A_Structure指针的函数:

在a.h

A_Structure_Ptr CreateA(int a, int b, int c);


void FreeA(A_Structure_Ptr obj);
void SetA_a( A_Structure_Ptr obj, int a );
int  GetA_a( A_Structure_Ptr obj );
// etc.

in b.c

A_Structure_Ptr CreateA(int a, int b, int c)
{
     A_Structure_Ptr s = malloc( sizeof(A_Structure) );
     s->a = a;
     s->b = b;
     s->c = c;
}

void FreeA(A_Structure_Ptr obj)
{
    free( obj );
}

void SetA_a( A_Structure_Ptr obj, int a )
{
    obj->a = a;
}

在main.c中

int main ()
{
    struct A_Structure *b = CreateA( 1, 2, 3);
    SetA_a( b, 3 );
    FreeA(b);
    return 0;
}

答案 1 :(得分:2)

将结构声明放入头文件中,但将定义保留在.c文件中时,这称为使用opaque pointer API

在这样的API中,消费者只使用指向对象的指针。只有实现需要知道对象的大小或内容。这就是你在C中做OOP的方法,也是信息隐藏的关键,它提供了更好的组件解耦。这是一个更完整的例子:

<强> foo.h中

struct foo;    // forward declaration

struct foo *foo_create(void);
void        foo_use(struct foo *f);
void        foo_destroy(struct foo *f);

<强> foo.c的

#include <stdlib.h>
#include "foo.h"

struct foo {
    int a, b, c;      // Consumers don't know about these!
};

struct foo *foo_create(void)
{
    struct foo *f = malloc(sizeof(*f));
    if (!f)
        return NULL;

    *f = (struct foo) {
        .a = 1,
        .b = 2,
        .c = 3,
    };
    return f;
}

void foo_use(struct foo *f)
{
    // something with f->a, f->b
}

void foo_destroy(struct foo *f)
{
    free(f);
}

<强>的main.c

#include "foo.h"

int main(void)
{
    struct foo *f;   // As a consumer of foo, we can only use **pointers**

    f = foo_create();
    if (!f)
        return 1;

    // I cannot access the members of `struct foo` here.
    // In an opaque API, the struct members are considered
    // an implementation detail and cannot be used outside
    // of the implementation.

    foo_use(f);

    foo_destroy(f);

    return 0;
}

答案 2 :(得分:2)

您必须决定是否要隐藏&#34;外部&#34;的结构细节。或不。如果您不想隐藏它们,只需将结构定义放在a.h中即可。隐藏它可确保您对b.c内容的更好解耦和集中控制,但这意味着您必须提供一种在b.c中创建对象的方法(例如

struct A_Structure *create_A_Structure(void);

并从外面使用它。

一种不相关的风格建议:最好不要typedef指针。虽然你的_Ptr后缀很明显,但 星座仍然更好,因为这是C程序员习惯的,所以事实上它&# 39;乍一看显然是指针

我建议这样的事情:

/* header */

typedef struct A A;

A *A_create(void);



/* implementation */

struct A
{
    int foo;
}

A *A_create(void)
{
    return malloc(sizeof(A));
}