我举了以下例子来说明我的问题:
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;
}
我尝试以这种方式创建结构但仍然失败。
答案 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));
}