我有2个头文件api.h和impl.h
api.h
对外部文件可见,并将包含在其他“.c”文件中。所以api.h包括impl.h
api.h定义了2个结构
typedef struct
{
uint32_t att;
union
{
struct
{
void* buffer;
size_t length;
} x;
struct
{
int a, b;
} v;
} content;
}dummy;
和impl.h有一些其他结构和函数def使用这种结构。 我试着向前宣布,但它对我没有帮助。
请帮忙。
答案 0 :(得分:2)
实际上,您的dummy
不是一个结构,而是一个未命名结构的typedef
。尝试命名结构,然后可以向前声明它:
typedef struct sdummy dummy; // forward declaration
void foo(dummy *);
struct sdummy { ... }; // definition
答案 1 :(得分:1)
在api.h
中重新排序代码,以便类型声明位于#include "impl.h"
之前,或者为您的(当前匿名)结构本身提供dummy
,dummy_
,{{ 1}}所以你可以添加一个前向声明
dummy_s
到typedef struct dummy_ dummy;
。
答案 2 :(得分:1)
如果要隐藏结构的详细信息,则必须在某个.c
文件中定义它,比如说impl.c
,以便它与该编译单元具有内部链接。要使用它,您必须公开create,destroy,getter和setter函数。所以基本设置如下:
api.h
,包含结构的前向声明
// forward declaration
typedef struct dummy* dummy_t;
// create / destroy / setter / getter (omitted)
dummy_t alloc_dummy();
void free_dummy(dummy_t);
void set_number(dummy_t, int);
void set_string(dummy_t, char*);
void print_dummy(dummy_t);
然后来impl.c
#include "api.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
struct dummy {
int n;
char* s;
};
dummy_t alloc_dummy()
{
return malloc(sizeof(struct dummy));
}
void free_dummy(dummy_t dummy)
{
if(dummy) {
free(dummy->s);
free(dummy);
}
}
void set_number(dummy_t dummy, int n)
{
if(dummy) {
dummy->n = n;
}
}
void set_string(dummy_t dummy, char* s)
{
if(dummy && s) {
dummy->s = strdup(s);
}
}
void print_dummy(dummy_t dummy)
{
if(dummy) {
printf("%d, %s\n", dummy->n, dummy->s);
}
}
最后在其他一些C文件中使用main.c
#include "api.h"
int main(int argc, char** argv)
{
// struct dummy d; // error! type is unknown
// instead use the create function
dummy_t d = alloc_dummy();
// d->n = 1; // error! dereference of unknown type
// instead use the setter function
set_number(d, 1);
set_string(d, "Hello, world!");
print_dummy(d);
free_dummy(d);
return 0;
}
<强>输出继电器强>
1, Hello, world!