前瞻性声明C.

时间:2013-06-07 08:49:52

标签: c linux

我有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使用这种结构。 我试着向前宣布,但它对我没有帮助。

请帮忙。

3 个答案:

答案 0 :(得分:2)

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

typedef struct sdummy dummy; // forward declaration

void foo(dummy *);

struct sdummy { ... }; // definition

答案 1 :(得分:1)

api.h中重新排序代码,以便类型声明位于#include "impl.h"之前,或者为您的(当前匿名)结构本身提供dummydummy_,{{ 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!