在头文件

时间:2016-02-23 14:07:36

标签: c declaration

我的 fifo.c 文件中有fifo_t类型定义,如下所示。在头文件 fifo.h 中应该声明什么类型?我想让这个结构的内容只在 fifo.c 文件中知道。此外,我不希望能够通过struct struct_name var;创建此结构的实例。只有有效的方式应该是fifo_t var;

typedef struct {
    uint8_t *buffer,
    uint8_t indexRead,
    uint8_t indexWrite,
    uint8_t used,
    uint8_t size
} fifo_t;

3 个答案:

答案 0 :(得分:4)

如果您只想将指针传递给fifo_t,那么您只能在头文件中转发声明它。但是,对于未命名的结构,typedef仅在您定义结构的内容时才有效。因此,如果您不想编译struct fifo_t var;,则必须使用一些反直觉的名称,可能类似于fifo_t_。例如:

typedef struct fifo_t_ fifo_t;
void fifo_use(fifo_t*); // ok, just uses pointer

然后在.c文件中,执行(请注意,使用逗号分隔成员并不是有效的语法):

struct fifo_t_ {
    uint8_t *buffer;
    uint8_t indexRead;
    uint8_t indexWrite;
    uint8_t used;
    uint8_t size;
};

void fifo_use(fifo_t* f) {
    f->indexRead = 1;
}

另外,请注意fifo_t var;无法正常工作,因为您需要知道结构的大小才能为其分配空间。您可能做的事情是在内部使用指针,以对用户透明的方式:

// in .h file:

typedef struct fifo_t_* fifo_t;

void fifo_init(fifo_t*);
void fifo_free(fifo_t);
void fifo_use(fifo_t);

// in .c file:

struct fifo_t_{
    uint8_t *buffer;
    uint8_t indexRead;
    uint8_t indexWrite;
    uint8_t used;
    uint8_t size;
};

void fifo_init(fifo_t* f) {
    *f = (fifo_t)malloc(sizeof(struct fifo_t_));
}

void fifo_free(fifo_t f) {
    free(f);
}

void fifo_use(fifo_t f) {
    f->indexRead = 1;
}


// somewhere else

int main() {
    fifo_t fifo;
    fifo_init(&fifo);
    fifo_use(fifo);
    fifo_free(fifo);
}

答案 1 :(得分:0)

如果您希望能够在fifo_t等堆栈上创建fifo_t var;,则无法隐藏sizeof(fifo_t)的内容,因为fifo_t未知

您可以在标题struct fifo_t;中对fifo_t进行forvard声明。在其他文件中,您可以为fifo_t *var; create(&var); do_work(var); destroy(var); 创建poiners,并使用应在fifo.c中实现的函数与它们一起使用

class Test_File(unittest.TestCase):
    def test_$FILE_NAME(self):
        return_val = validate_data($FILE_NAME)
        assert return_val

答案 2 :(得分:0)

如果你想在 fifo.h 中定义结构,那么这就是要走的路:

<强> fifo.h

... 
#ifdef FIFO
 typedef struct {
    uint8_t *buffer,
    uint8_t indexRead,
    uint8_t indexWrite,
    uint8_t used,
    uint8_t size
} fifo_t;
#else
...
#endif
...

<强> fifo.c

#define FIFO
#include "fifo.h"
...

所以 fifo.h 仍然可以包含在其他源文件中,但结构类型为hide,只有 fifo.c

才能显示