0

我有 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 使用这个结构。我尝试了前向声明,但它对我没有帮助。

请帮忙 。

4

3 回答 3

2

实际上,你dummy的不是一个结构,而是一个typedef未命名的结构。尝试命名结构,然后您可以前向声明它:

typedef struct sdummy dummy; // forward declaration

void foo(dummy *);

struct sdummy { ... }; // definition
于 2013-06-07T08:55:26.117 回答
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!
于 2013-06-07T09:39:40.283 回答
1

要么重新排序你的代码,所以api.h类型声明在前面,或者给#include "impl.h"你的(当前匿名的)结构本身一个名字,比如dummydummy_dummy_s

typedef struct dummy_ dummy;

impl.h.

于 2013-06-07T08:55:36.560 回答